aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/ui-ssdiff.h
blob: 88627e297c8b2091919e6274010d2bb7812ca067 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#ifndef UI_SSDIFF_H
#define UI_SSDIFF_H

/*
 * ssdiff line limits
 */
#ifndef MAX_SSDIFF_M
#define MAX_SSDIFF_M 128
#endif

#ifndef MAX_SSDIFF_N
#define MAX_SSDIFF_N 128
#endif
#define MAX_SSDIFF_SIZE ((MAX_SSDIFF_M) * (MAX_SSDIFF_N))

extern void cgit_ssdiff_print_deferred_lines();

extern void cgit_ssdiff_line_cb(char *line, int len);

extern void cgit_ssdiff_header_begin();
extern void cgit_ssdiff_header_end();

extern void cgit_ssdiff_footer();

#endif /* UI_SSDIFF_H */
e 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; }