/* opt.c: a module used to parse command line options for newsfetch */ #include #include #include #include #include "newsfetch.h" /* this has a lot of crap to bring in */ int get_commandline(int argc, char *argv[], char *dirname, char *rcname, int *cleanup, int *wait_after_articles, int *wait_for_time, int *command_flag, char *execute_command, int *pipe_flag, char *pipe_command, int *only_list, int *procmailrc, int *timeout) { extern char *optarg; extern int optind, opterr, optopt, news_target; int c, i, tmp; char *multi_spPyY = "You can only specify one of the -s, -y, -Y, -p or -P option"; while (1) { /* Options (not all supported) -d dirname to store news file -s print news to stdout -f alternative rc file -v| -V -> Print version and exit -c -> Do not update configuration file after downloading articles -w -> Wait for T sec after downloading of N articles -t -> time -T -> timeout -x -> execute command after each group fetching -p -> pipe each article -P -> pipe group -y -> pipe to procmail -Y -> pipe each article */ c = getopt(argc, argv, "w:t:T:d:f:U:N:x:p:P:Y:yslVvchH-"); if (c == EOF) break; switch (c) { case ':': fprintf(stderr, "missing parameter %s", optarg); break; case 'd': i = strlen(optarg); if (i < 100) { if (optarg[0] == '.') { /* for odd behavior of procmail */ strcat(dirname, "/"); strcat(dirname, optarg); } else strcpy(dirname, optarg); i = strlen(dirname); if (dirname[i - 1] == '/') dirname[i - 1] = '\0'; if (!create_directory(dirname)) exit(1); } else { fprintf(stderr, "dirname too long\n"); exit(1); } break; case 'f': strcpy(rcname, optarg); break; case 'c': *cleanup = 0; break; case 'l': *only_list = 1; return (1); case 's': if (news_target) { fprintf(stderr, "%s\n", multi_spPyY); exit(1); } news_target = 2; break; case 'p': if (news_target) { fprintf(stderr, "%s\n", multi_spPyY); exit(1); } news_target = 3; strcpy(pipe_command, optarg); break; case 'P': if (news_target) { fprintf(stderr, "%s\n", multi_spPyY); exit(1); } news_target = 4; strcpy(pipe_command, optarg); break; case 'y': if (news_target) { fprintf(stderr, "%s\n", multi_spPyY); exit(1); } news_target = 3; *procmailrc = 1; strcpy(pipe_command, PROCMAIL_COMMAND); break; case 'Y': if (news_target) { fprintf(stderr, "%s\n", multi_spPyY); exit(1); } news_target = 3; *procmailrc = 1; strcpy(pipe_command, optarg); strcat(pipe_command, " "); break; case 'v': case 'V': exit(1); case 'h': case 'H': opt_help(argv[0]); return (1); /* unreachable */ case 'w': tmp = atoi(optarg); if (tmp == 0) { fprintf(stderr, "argument to -w should be valid number\n"); exit(-1); } else (*wait_after_articles) = tmp; break; case 't': tmp = atoi(optarg); if (tmp == 0) { fprintf(stderr, "argument to -t should be valid number\n"); exit(-1); } (*wait_for_time) = tmp; break; case 'T': /* not checking optarg */ (*timeout) = atoi(optarg); break; case 'x': *command_flag = 1; strcpy(execute_command, optarg); break; case '?': exit(-1); case '-': opt_help(argv[0]); exit(1); return (-1); default: return (-1); } } return (1); } /* pretty obvious i'd say */ void opt_help(char *prog_name) /* later on replace prog_name with a NAME definition in newsfetch.h */ { fprintf(stderr, "Usage: %s nntp_server [options]\n", prog_name); fprintf(stderr, "Options:\n"); fprintf(stderr, " [-clsyvV] [-d dirname] [-f rcfile] [-t N]\n"); fprintf(stderr, "[-T timeout][-w M][-pPY filter][-x command]\n"); exit(1); }