示例#1
0
文件: ar.c 项目: probonopd/klik
/*
 * 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));
}
示例#2
0
文件: ar.c 项目: McIkye/tools
/*
 * 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));
}