/* * main -- * main basically uses getopt to parse options and calls the appropriate * functions. Some hacks that let us be backward compatible with 4.3 ar * option parsing and sanity checking. */ int main(int argc, char *argv[]) { int c; char *p; int (*fcall)(char **); if (argc < 3) usage(); /* * Historic versions didn't require a '-' in front of the options. * Fix it, if necessary. */ if (*argv[1] != '-') { size_t len; len = (u_int)(strlen(argv[1]) + 2); if (!(p = malloc(len))) err(1, NULL); *p = '-'; (void)strncpy(p + 1, argv[1], len - 1); argv[1] = p; } while ((c = getopt(argc, argv, "abcCdilmopqrTtuvx")) != -1) { switch(c) { case 'a': options |= AR_A; break; case 'b': case 'i': options |= AR_B; break; case 'c': options |= AR_C; break; case 'C': options |= AR_CC; break; case 'd': options |= AR_D; fcall = delete; break; case 'l': /* not documented, compatibility only */ envtmp = "."; break; case 'm': options |= AR_M; fcall = move; break; case 'o': options |= AR_O; break; case 'p': options |= AR_P; fcall = print; break; case 'q': options |= AR_Q; fcall = append; break; case 'r': options |= AR_R; fcall = replace; break; case 'T': options |= AR_TR; break; case 't': options |= AR_T; fcall = contents; break; case 'u': options |= AR_U; break; case 'v': options |= AR_V; break; case 'x': options |= AR_X; fcall = extract; break; default: usage(); } } argv += optind; argc -= optind; /* One of -dmpqrtx required. */ if (!(options & (AR_D|AR_M|AR_P|AR_Q|AR_R|AR_T|AR_X))) { warnx("one of options -dmpqrtx is required"); usage(); } /* Only one of -a and -bi allowed. */ if (options & AR_A && options & AR_B) { warnx("only one of -a and -[bi] options allowed"); usage(); } /* -ab require a position argument. */ if (options & (AR_A|AR_B)) { if (!(posarg = *argv++)) { warnx("no position operand specified"); usage(); } posname = rname(posarg); } /* -d only valid with -Tv. */ if (options & AR_D && options & ~(AR_D|AR_TR|AR_V)) badoptions("-d"); /* -m only valid with -abiTv. */ if (options & AR_M && options & ~(AR_A|AR_B|AR_M|AR_TR|AR_V)) badoptions("-m"); /* -p only valid with -Tv. */ if (options & AR_P && options & ~(AR_P|AR_TR|AR_V)) badoptions("-p"); /* -q only valid with -cTv. */ if (options & AR_Q && options & ~(AR_C|AR_Q|AR_TR|AR_V)) badoptions("-q"); /* -r only valid with -abcuTv. */ if (options & AR_R && options & ~(AR_A|AR_B|AR_C|AR_R|AR_U|AR_TR|AR_V)) badoptions("-r"); /* -t only valid with -Tv. */ if (options & AR_T && options & ~(AR_T|AR_TR|AR_V)) badoptions("-t"); /* -x only valid with -CouTv. */ if (options & AR_X && options & ~(AR_O|AR_U|AR_TR|AR_V|AR_X|AR_CC)) badoptions("-x"); if (!(archive = *argv++)) { warnx("no archive specified"); usage(); } exit((*fcall)(argv)); }
/* * main -- * main basically uses getopt to parse options and calls the appropriate * functions. Some hacks that let us be backward compatible with 4.3 ar * option parsing and sanity checking. */ int main(int argc, char *argv[]) { extern char *__progname; int c; char *p; int (*fcall)(char **); fcall = NULL; if (strcmp(__progname, "ranlib") == 0) { if (argc < 2) usage(); options |= AR_S; while ((c = getopt(argc, argv, "t")) != -1) switch(c) { case 't': options |= AR_T; break; default: usage(); } } else { if (argc < 3) usage(); /* * Historic versions didn't require a '-' in front of the * options. Fix it, if necessary. */ if (*argv[1] != '-') { size_t len; len = (u_int)(strlen(argv[1]) + 2); if (!(p = malloc(len))) err(1, NULL); *p = '-'; (void)strlcpy(p + 1, argv[1], len - 1); argv[1] = p; } while ((c = getopt(argc, argv, "abcCdilmopqrsTtuvx")) != -1) switch(c) { case 'a': options |= AR_A; break; case 'b': case 'i': options |= AR_B; break; case 'c': options |= AR_C; break; case 'C': options |= AR_CC; break; case 'd': options |= AR_D; fcall = delete; break; case 'l': /* * "local" tmp-files option; * ignored for compatibility */ break; case 'm': options |= AR_M; fcall = move; break; case 'o': options |= AR_O; break; case 'p': options |= AR_P; fcall = print; break; case 'q': /* TODO optimise symdef generation for -c */ options |= AR_Q; fcall = append; break; case 'r': options |= AR_R; fcall = replace; break; case 's': options |= AR_S; break; case 'T': options |= AR_TR; break; case 't': options |= AR_T; fcall = contents; break; case 'u': options |= AR_U; break; case 'v': options |= AR_V; break; case 'x': options |= AR_X; fcall = extract; break; default: usage(); } } argv += optind; argc -= optind; /* single -s is a ranlib for the ar files given */ if (fcall == NULL && (options & AR_S)) exit(ranlib(argv)); /* One of -dmpqrtx required. */ if (!(options & (AR_D|AR_M|AR_P|AR_Q|AR_R|AR_T|AR_X))) { warnx("one of options -dmpqrtx is required"); usage(); } /* Only one of -a and -bi allowed. */ if (options & AR_A && options & AR_B) { warnx("only one of -a and -[bi] options allowed"); usage(); } /* -ab require a position argument. */ if (options & (AR_A|AR_B)) { if (!(posarg = *argv++)) { warnx("no position operand specified"); usage(); } posname = rname(posarg); } /* -d only valid with -sTv. */ if (options & AR_D && options & ~(AR_D|AR_TR|AR_S|AR_V)) badoptions("-d"); /* -m only valid with -abiTsv. */ if (options & AR_M && options & ~(AR_A|AR_B|AR_M|AR_TR|AR_S|AR_V)) badoptions("-m"); /* -p only valid with -Tv. */ if (options & AR_P && options & ~(AR_P|AR_TR|AR_V)) badoptions("-p"); /* -q only valid with -csTv. */ if (options & AR_Q && options & ~(AR_C|AR_Q|AR_TR|AR_S|AR_V)) badoptions("-q"); /* -r only valid with -abcuTsv. */ if (options & AR_R && options & ~(AR_A|AR_B|AR_C|AR_R|AR_U|AR_TR|AR_S|AR_V)) badoptions("-r"); /* -t only valid with -Tv. */ if (options & AR_T && options & ~(AR_T|AR_TR|AR_V)) badoptions("-t"); /* -x only valid with -CouTv. */ if (options & AR_X && options & ~(AR_O|AR_U|AR_TR|AR_V|AR_X|AR_CC)) badoptions("-x"); if (!(archive = *argv++)) { warnx("no archive specified"); usage(); } exit((*fcall)(argv)); }