filter: split filter functions into their own file

A first step for more interesting things.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
Jason A. Donenfeld 2014-01-10 05:19:05 +01:00
parent b67ea0c022
commit 3eae406934
5 changed files with 90 additions and 71 deletions

42
cgit.c
View File

@ -27,36 +27,6 @@ static void add_mimetype(const char *name, const char *value)
item->util = xstrdup(value); item->util = xstrdup(value);
} }
static struct cgit_filter *new_filter(const char *cmd, filter_type filtertype)
{
struct cgit_filter *f;
int args_size = 0;
int extra_args;
if (!cmd || !cmd[0])
return NULL;
switch (filtertype) {
case SOURCE:
case ABOUT:
extra_args = 1;
break;
case COMMIT:
default:
extra_args = 0;
break;
}
f = xmalloc(sizeof(struct cgit_filter));
f->cmd = xstrdup(cmd);
args_size = (2 + extra_args) * sizeof(char *);
f->argv = xmalloc(args_size);
memset(f->argv, 0, args_size);
f->argv[0] = f->cmd;
return f;
}
static void process_cached_repolist(const char *path); static void process_cached_repolist(const char *path);
static void repo_config(struct cgit_repo *repo, const char *name, const char *value) static void repo_config(struct cgit_repo *repo, const char *name, const char *value)
@ -114,11 +84,11 @@ static void repo_config(struct cgit_repo *repo, const char *name, const char *va
repo->logo_link = xstrdup(value); repo->logo_link = xstrdup(value);
else if (ctx.cfg.enable_filter_overrides) { else if (ctx.cfg.enable_filter_overrides) {
if (!strcmp(name, "about-filter")) if (!strcmp(name, "about-filter"))
repo->about_filter = new_filter(value, ABOUT); repo->about_filter = cgit_new_filter(value, ABOUT);
else if (!strcmp(name, "commit-filter")) else if (!strcmp(name, "commit-filter"))
repo->commit_filter = new_filter(value, COMMIT); repo->commit_filter = cgit_new_filter(value, COMMIT);
else if (!strcmp(name, "source-filter")) else if (!strcmp(name, "source-filter"))
repo->source_filter = new_filter(value, SOURCE); repo->source_filter = cgit_new_filter(value, SOURCE);
} }
} }
@ -215,9 +185,9 @@ static void config_cb(const char *name, const char *value)
else if (!strcmp(name, "case-sensitive-sort")) else if (!strcmp(name, "case-sensitive-sort"))
ctx.cfg.case_sensitive_sort = atoi(value); ctx.cfg.case_sensitive_sort = atoi(value);
else if (!strcmp(name, "about-filter")) else if (!strcmp(name, "about-filter"))
ctx.cfg.about_filter = new_filter(value, ABOUT); ctx.cfg.about_filter = cgit_new_filter(value, ABOUT);
else if (!strcmp(name, "commit-filter")) else if (!strcmp(name, "commit-filter"))
ctx.cfg.commit_filter = new_filter(value, COMMIT); ctx.cfg.commit_filter = cgit_new_filter(value, COMMIT);
else if (!strcmp(name, "embedded")) else if (!strcmp(name, "embedded"))
ctx.cfg.embedded = atoi(value); ctx.cfg.embedded = atoi(value);
else if (!strcmp(name, "max-atom-items")) else if (!strcmp(name, "max-atom-items"))
@ -251,7 +221,7 @@ static void config_cb(const char *name, const char *value)
else if (!strcmp(name, "section-sort")) else if (!strcmp(name, "section-sort"))
ctx.cfg.section_sort = atoi(value); ctx.cfg.section_sort = atoi(value);
else if (!strcmp(name, "source-filter")) else if (!strcmp(name, "source-filter"))
ctx.cfg.source_filter = new_filter(value, SOURCE); ctx.cfg.source_filter = cgit_new_filter(value, SOURCE);
else if (!strcmp(name, "summary-log")) else if (!strcmp(name, "summary-log"))
ctx.cfg.summary_log = atoi(value); ctx.cfg.summary_log = atoi(value);
else if (!strcmp(name, "summary-branches")) else if (!strcmp(name, "summary-branches"))

1
cgit.h
View File

@ -344,6 +344,7 @@ extern int cgit_parse_snapshots_mask(const char *str);
extern int cgit_open_filter(struct cgit_filter *filter); extern int cgit_open_filter(struct cgit_filter *filter);
extern int cgit_close_filter(struct cgit_filter *filter); extern int cgit_close_filter(struct cgit_filter *filter);
extern struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype);
extern void cgit_prepare_repo_env(struct cgit_repo * repo); extern void cgit_prepare_repo_env(struct cgit_repo * repo);

View File

@ -29,6 +29,7 @@ CGIT_OBJ_NAMES += cgit.o
CGIT_OBJ_NAMES += cache.o CGIT_OBJ_NAMES += cache.o
CGIT_OBJ_NAMES += cmd.o CGIT_OBJ_NAMES += cmd.o
CGIT_OBJ_NAMES += configfile.o CGIT_OBJ_NAMES += configfile.o
CGIT_OBJ_NAMES += filter.o
CGIT_OBJ_NAMES += html.o CGIT_OBJ_NAMES += html.o
CGIT_OBJ_NAMES += parsing.o CGIT_OBJ_NAMES += parsing.o
CGIT_OBJ_NAMES += scan-tree.o CGIT_OBJ_NAMES += scan-tree.o

82
filter.c Normal file
View File

@ -0,0 +1,82 @@
/* filter.c: filter framework functions
*
* Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com>
*
* Licensed under GNU General Public License v2
* (see COPYING for full license text)
*/
#include "cgit.h"
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int cgit_open_filter(struct cgit_filter *filter)
{
filter->old_stdout = chk_positive(dup(STDOUT_FILENO),
"Unable to duplicate STDOUT");
chk_zero(pipe(filter->pipe_fh), "Unable to create pipe to subprocess");
filter->pid = chk_non_negative(fork(), "Unable to create subprocess");
if (filter->pid == 0) {
close(filter->pipe_fh[1]);
chk_non_negative(dup2(filter->pipe_fh[0], STDIN_FILENO),
"Unable to use pipe as STDIN");
execvp(filter->cmd, filter->argv);
die_errno("Unable to exec subprocess %s", filter->cmd);
}
close(filter->pipe_fh[0]);
chk_non_negative(dup2(filter->pipe_fh[1], STDOUT_FILENO),
"Unable to use pipe as STDOUT");
close(filter->pipe_fh[1]);
return 0;
}
int cgit_close_filter(struct cgit_filter *filter)
{
int exit_status;
chk_non_negative(dup2(filter->old_stdout, STDOUT_FILENO),
"Unable to restore STDOUT");
close(filter->old_stdout);
if (filter->pid < 0)
return 0;
waitpid(filter->pid, &exit_status, 0);
if (WIFEXITED(exit_status) && !WEXITSTATUS(exit_status))
return 0;
die("Subprocess %s exited abnormally", filter->cmd);
}
struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype)
{
struct cgit_filter *f;
int args_size = 0;
int extra_args;
if (!cmd || !cmd[0])
return NULL;
switch (filtertype) {
case SOURCE:
case ABOUT:
extra_args = 1;
break;
case COMMIT:
default:
extra_args = 0;
break;
}
f = xmalloc(sizeof(struct cgit_filter));
memset(f, 0, sizeof(struct cgit_filter));
f->cmd = xstrdup(cmd);
args_size = (2 + extra_args) * sizeof(char *);
f->argv = xmalloc(args_size);
memset(f->argv, 0, args_size);
f->argv[0] = f->cmd;
return f;
}

View File

@ -457,41 +457,6 @@ void cgit_prepare_repo_env(struct cgit_repo * repo)
fprintf(stderr, warn, p->name, p->value); fprintf(stderr, warn, p->name, p->value);
} }
int cgit_open_filter(struct cgit_filter *filter)
{
filter->old_stdout = chk_positive(dup(STDOUT_FILENO),
"Unable to duplicate STDOUT");
chk_zero(pipe(filter->pipe_fh), "Unable to create pipe to subprocess");
filter->pid = chk_non_negative(fork(), "Unable to create subprocess");
if (filter->pid == 0) {
close(filter->pipe_fh[1]);
chk_non_negative(dup2(filter->pipe_fh[0], STDIN_FILENO),
"Unable to use pipe as STDIN");
execvp(filter->cmd, filter->argv);
die_errno("Unable to exec subprocess %s", filter->cmd);
}
close(filter->pipe_fh[0]);
chk_non_negative(dup2(filter->pipe_fh[1], STDOUT_FILENO),
"Unable to use pipe as STDOUT");
close(filter->pipe_fh[1]);
return 0;
}
int cgit_close_filter(struct cgit_filter *filter)
{
int exit_status;
chk_non_negative(dup2(filter->old_stdout, STDOUT_FILENO),
"Unable to restore STDOUT");
close(filter->old_stdout);
if (filter->pid < 0)
return 0;
waitpid(filter->pid, &exit_status, 0);
if (WIFEXITED(exit_status) && !WEXITSTATUS(exit_status))
return 0;
die("Subprocess %s exited abnormally", filter->cmd);
}
/* Read the content of the specified file into a newly allocated buffer, /* Read the content of the specified file into a newly allocated buffer,
* zeroterminate the buffer and return 0 on success, errno otherwise. * zeroterminate the buffer and return 0 on success, errno otherwise.
*/ */