summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c15
-rw-r--r--cgit.h12
-rw-r--r--shared.c35
3 files changed, 62 insertions, 0 deletions
diff --git a/cgit.c b/cgit.c
index 2039ab1..779a464 100644
--- a/cgit.c
+++ b/cgit.c
@@ -4,32 +4,47 @@
4 * 4 *
5 * Licensed under GNU General Public License v2 5 * Licensed under GNU General Public License v2
6 * (see COPYING for full license text) 6 * (see COPYING for full license text)
7 */ 7 */
8 8
9#include "cgit.h" 9#include "cgit.h"
10#include "cache.h" 10#include "cache.h"
11#include "cmd.h" 11#include "cmd.h"
12#include "configfile.h" 12#include "configfile.h"
13#include "html.h" 13#include "html.h"
14#include "ui-shared.h" 14#include "ui-shared.h"
15#include "ui-stats.h" 15#include "ui-stats.h"
16#include "scan-tree.h" 16#include "scan-tree.h"
17 17
18const char *cgit_version = CGIT_VERSION; 18const char *cgit_version = CGIT_VERSION;
19 19
20struct cgit_filter *new_filter(const char *cmd, int extra_args)
21{
22 struct cgit_filter *f;
23
24 if (!cmd)
25 return NULL;
26
27 f = xmalloc(sizeof(struct cgit_filter));
28 f->cmd = xstrdup(cmd);
29 f->argv = xmalloc((2 + extra_args) * sizeof(char *));
30 f->argv[0] = f->cmd;
31 f->argv[1] = NULL;
32 return f;
33}
34
20void config_cb(const char *name, const char *value) 35void config_cb(const char *name, const char *value)
21{ 36{
22 if (!strcmp(name, "root-title")) 37 if (!strcmp(name, "root-title"))
23 ctx.cfg.root_title = xstrdup(value); 38 ctx.cfg.root_title = xstrdup(value);
24 else if (!strcmp(name, "root-desc")) 39 else if (!strcmp(name, "root-desc"))
25 ctx.cfg.root_desc = xstrdup(value); 40 ctx.cfg.root_desc = xstrdup(value);
26 else if (!strcmp(name, "root-readme")) 41 else if (!strcmp(name, "root-readme"))
27 ctx.cfg.root_readme = xstrdup(value); 42 ctx.cfg.root_readme = xstrdup(value);
28 else if (!strcmp(name, "css")) 43 else if (!strcmp(name, "css"))
29 ctx.cfg.css = xstrdup(value); 44 ctx.cfg.css = xstrdup(value);
30 else if (!strcmp(name, "favicon")) 45 else if (!strcmp(name, "favicon"))
31 ctx.cfg.favicon = xstrdup(value); 46 ctx.cfg.favicon = xstrdup(value);
32 else if (!strcmp(name, "footer")) 47 else if (!strcmp(name, "footer"))
33 ctx.cfg.footer = xstrdup(value); 48 ctx.cfg.footer = xstrdup(value);
34 else if (!strcmp(name, "head-include")) 49 else if (!strcmp(name, "head-include"))
35 ctx.cfg.head_include = xstrdup(value); 50 ctx.cfg.head_include = xstrdup(value);
diff --git a/cgit.h b/cgit.h
index 8c64efe..d0fff1f 100644
--- a/cgit.h
+++ b/cgit.h
@@ -116,32 +116,41 @@ struct cgit_query {
116 char *search; 116 char *search;
117 char *grep; 117 char *grep;
118 char *head; 118 char *head;
119 char *sha1; 119 char *sha1;
120 char *sha2; 120 char *sha2;
121 char *path; 121 char *path;
122 char *name; 122 char *name;
123 char *mimetype; 123 char *mimetype;
124 char *url; 124 char *url;
125 char *period; 125 char *period;
126 int ofs; 126 int ofs;
127 int nohead; 127 int nohead;
128 char *sort; 128 char *sort;
129 int showmsg; 129 int showmsg;
130}; 130};
131 131
132struct cgit_filter {
133 char *cmd;
134 char **argv;
135 int old_stdout;
136 int pipe_fh[2];
137 int pid;
138 int exitstatus;
139};
140
132struct cgit_config { 141struct cgit_config {
133 char *agefile; 142 char *agefile;
134 char *cache_root; 143 char *cache_root;
135 char *clone_prefix; 144 char *clone_prefix;
136 char *css; 145 char *css;
137 char *favicon; 146 char *favicon;
138 char *footer; 147 char *footer;
139 char *head_include; 148 char *head_include;
140 char *header; 149 char *header;
141 char *index_header; 150 char *index_header;
142 char *index_info; 151 char *index_info;
143 char *logo; 152 char *logo;
144 char *logo_link; 153 char *logo_link;
145 char *module_link; 154 char *module_link;
146 char *repo_group; 155 char *repo_group;
147 char *robots; 156 char *robots;
@@ -235,18 +244,21 @@ extern int cgit_diff_files(const unsigned char *old_sha1,
235extern void cgit_diff_tree(const unsigned char *old_sha1, 244extern void cgit_diff_tree(const unsigned char *old_sha1,
236 const unsigned char *new_sha1, 245 const unsigned char *new_sha1,
237 filepair_fn fn, const char *prefix); 246 filepair_fn fn, const char *prefix);
238 247
239extern void cgit_diff_commit(struct commit *commit, filepair_fn fn); 248extern void cgit_diff_commit(struct commit *commit, filepair_fn fn);
240 249
241extern char *fmt(const char *format,...); 250extern char *fmt(const char *format,...);
242 251
243extern struct commitinfo *cgit_parse_commit(struct commit *commit); 252extern struct commitinfo *cgit_parse_commit(struct commit *commit);
244extern struct taginfo *cgit_parse_tag(struct tag *tag); 253extern struct taginfo *cgit_parse_tag(struct tag *tag);
245extern void cgit_parse_url(const char *url); 254extern void cgit_parse_url(const char *url);
246 255
247extern const char *cgit_repobasename(const char *reponame); 256extern const char *cgit_repobasename(const char *reponame);
248 257
249extern int cgit_parse_snapshots_mask(const char *str); 258extern int cgit_parse_snapshots_mask(const char *str);
250 259
260extern int cgit_open_filter(struct cgit_filter *filter);
261extern int cgit_close_filter(struct cgit_filter *filter);
262
251 263
252#endif /* CGIT_H */ 264#endif /* CGIT_H */
diff --git a/shared.c b/shared.c
index cce0af4..288cfa2 100644
--- a/shared.c
+++ b/shared.c
@@ -342,16 +342,51 @@ int cgit_parse_snapshots_mask(const char *str)
342 str += strspn(str,delim); 342 str += strspn(str,delim);
343 tl = strcspn(str,delim); 343 tl = strcspn(str,delim);
344 if (!tl) 344 if (!tl)
345 break; 345 break;
346 for (f = cgit_snapshot_formats; f->suffix; f++) { 346 for (f = cgit_snapshot_formats; f->suffix; f++) {
347 sl = strlen(f->suffix); 347 sl = strlen(f->suffix);
348 if((tl == sl && !strncmp(f->suffix, str, tl)) || 348 if((tl == sl && !strncmp(f->suffix, str, tl)) ||
349 (tl == sl-1 && !strncmp(f->suffix+1, str, tl-1))) { 349 (tl == sl-1 && !strncmp(f->suffix+1, str, tl-1))) {
350 rv |= f->bit; 350 rv |= f->bit;
351 break; 351 break;
352 } 352 }
353 } 353 }
354 str += tl; 354 str += tl;
355 } 355 }
356 return rv; 356 return rv;
357} 357}
358
359int cgit_open_filter(struct cgit_filter *filter)
360{
361
362 filter->old_stdout = chk_positive(dup(STDOUT_FILENO),
363 "Unable to duplicate STDOUT");
364 chk_zero(pipe(filter->pipe_fh), "Unable to create pipe to subprocess");
365 filter->pid = chk_non_negative(fork(), "Unable to create subprocess");
366 if (filter->pid == 0) {
367 close(filter->pipe_fh[1]);
368 chk_non_negative(dup2(filter->pipe_fh[0], STDIN_FILENO),
369 "Unable to use pipe as STDIN");
370 execvp(filter->cmd, filter->argv);
371 die("Unable to exec subprocess %s: %s (%d)", filter->cmd,
372 strerror(errno), errno);
373 }
374 close(filter->pipe_fh[0]);
375 chk_non_negative(dup2(filter->pipe_fh[1], STDOUT_FILENO),
376 "Unable to use pipe as STDOUT");
377 close(filter->pipe_fh[1]);
378 return 0;
379}
380
381int cgit_close_filter(struct cgit_filter *filter)
382{
383 chk_non_negative(dup2(filter->old_stdout, STDOUT_FILENO),
384 "Unable to restore STDOUT");
385 close(filter->old_stdout);
386 if (filter->pid < 0)
387 return 0;
388 waitpid(filter->pid, &filter->exitstatus, 0);
389 if (WIFEXITED(filter->exitstatus) && !WEXITSTATUS(filter->exitstatus))
390 return 0;
391 die("Subprocess %s exited abnormally", filter->cmd);
392}