diff options
author | Willy Tarreau <willy@wtap.(none)> | 2006-07-26 10:46:55 +0200 |
---|---|---|
committer | Willy Tarreau <willy@wtap.(none)> | 2006-07-26 10:46:55 +0200 |
commit | fcb250efba23ae522c4c8cb03c47dd40edcf9603 (patch) | |
tree | 3756bd1748842a3f1049d857e8412f148a8741b9 /flx/sign.c | |
parent | Initial commit (diff) | |
download | flxutils-fcb250efba23ae522c4c8cb03c47dd40edcf9603.tar.xz |
[RELEASE] flxutils-0.1.4.2v0.1.4.2
Diffstat (limited to 'flx/sign.c')
-rw-r--r-- | flx/sign.c | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/flx/sign.c b/flx/sign.c new file mode 100644 index 0000000..146a8a0 --- /dev/null +++ b/flx/sign.c @@ -0,0 +1,117 @@ +#include <stdio.h> +#include "input.h" +#include "output.h" +#include "source_type.h" +#include "arg.h" +#include "input_fs.h" +#include "input_file.h" +#include "output_file.h" + +/* source type have the form : + * [type[(type_options)]:]file[:origin1][=rewrite1],[origin2[=rewrite2]] + * if type isn't set, type = 'fs' + * the end of the string was treat by specific init function + * type_options : [!]type_option[,type_options] + * input fs specific options : + * - xdev : don't go across fs (default) + * - flw : follow symlinks links + * - depth : directory depth to walk + * output file tree specific options : + * - level=N : subdirectory level to create + * output specific options : + * - long : human readable form + */ + +/* command line is: + * ./flx sign [options] [inputs] + * options are : + * -h,--help : this help + */ + + +static t_source_type InputTypes[] = { + { "fs", + (void*)input_fs_open, (void*)input_fs_read, NULL, (void*)input_fs_close, + (void*)input_fs_fcntl }, + { "file", + (void*)input_file_open, (void*)input_file_read, NULL, (void*)input_file_close, + (void*)input_file_fcntl }, + { "stdin", + (void*)input_stdin_open, (void*)input_file_read, NULL, (void*)input_file_close, + (void*)input_file_fcntl }, + { NULL } +}; +static t_source_type OutputTypes[] = { + { "file", + (void*)output_file_open, NULL, (void*)output_file_write, (void*)output_file_close, + (void*)output_file_fcntl }, + { "stdout",(void*)output_stdout_open, NULL, (void*)output_file_write, (void*)output_file_close, + (void*)output_file_fcntl }, + { NULL } +}; + +static void *SignOutput = NULL, *SignInput = NULL; + + +#define O_HELP 1 +#define O_OUTPUT 2 +#define O_IGN_DOT 3 +#define O_IGN_DEPTH 4 + +t_param flxsign_poptions[] = { + { 'h', "help", O_HELP, 0, + "-h,--help show this help"}, + { 'o', "output", O_OUTPUT, 1, + "-o,--output <file> select output"}, + { 0, "ignore-dot", O_IGN_DOT, 0, + "--ignore-dot do not store '.' and '..'" }, + { 0, "no-depth", O_IGN_DEPTH, 0, + "--no-depth do not run across directories" }, + { 0, NULL, 0 } +} ; + +int flxsign_pfct(int opt, t_param *param, char **flag, char **argv) { + if (opt == O_HELP) arg_usage(flxsign_poptions, NULL); + else if (opt == O_OUTPUT) { + if (!SignOutput) SignOutput = output_alloc(); + output_add(SignOutput, argv[1], OutputTypes); + } + else if (opt == O_IGN_DOT) SET(Options, GOPT_IGNORE_DOT); + else if (opt == O_IGN_DEPTH) SET(Options, GOPT_IGNORE_DEPTH); + else if (opt == -1) { + if (!SignInput) SignInput = input_alloc(); + input_add(SignInput, *argv, InputTypes); + } + else return (-1); + return (param ? param->minarg : 0); +} + + +int flxsign_main(int argc, char **argv) { + t_ft Root = { &Root, &Root, &Root /* parent */, NULL /* subtree */ , + NULL /* filename */, NULL /* desc */, BASE|CHANGED /* status */ }; + int nb; + + if (!SignInput) { + SignInput = input_alloc(); + input_add(SignInput, "fs:.", InputTypes); + } + + if (!SignOutput) { + SignOutput = output_alloc(); + output_add(SignOutput, "stdout:", OutputTypes); + } + + while ((nb = input_read(SignInput, &Root))) { + output_write(SignOutput, &Root, nb); + ft_free(&Root, (void*)fct_free_file_desc, NULL); + } + output_write(SignOutput, &Root, 0); + ft_free(&Root, (void*)fct_free_file_desc, NULL); + + output_free(SignOutput); + input_free(SignInput); + return (0); +} + + |