2eb55c33d767b76bc330ba95a716cce7f144de9e
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
* This code is derived from software contributed to Berkeley by
* Hugh Smith at The University of Guelph.
* %sccs.include.redist.c%
static char copyright
[] =
"@(#) Copyright (c) 1990, 1993\n\
The Regents of the University of California. All rights reserved.\n";
static char sccsid
[] = "@(#)ar.c 8.1 (Berkeley) %G%";
char *archive
, *envtmp
, *posarg
, *posname
;
static void badoptions(), usage();
* 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 (*fcall
)(), append(), contents(), delete(), extract(),
move(), print(), replace();
* Historic versions didn't require a '-' in front of the options.
if (!(p
= malloc((u_int
)(strlen(argv
[1]) + 2)))) {
(void)fprintf(stderr
, "ar: %s.\n", strerror(errno
));
(void)strcpy(p
+ 1, argv
[1]);
while ((c
= getopt(argc
, argv
, "abcdilmopqrTtuvx")) != EOF
) {
case 'l': /* not documented, compatibility only */
/* One of -dmpqrtx required. */
if (!(options
& (AR_D
|AR_M
|AR_P
|AR_Q
|AR_R
|AR_T
|AR_X
))) {
"ar: one of options -dmpqrtx is required.\n");
/* Only one of -a and -bi allowed. */
if (options
& AR_A
&& options
& AR_B
) {
"ar: only one of -a and -[bi] options allowed.\n");
/* -ab require a position argument. */
if (options
& (AR_A
|AR_B
)) {
if (!(posarg
= *argv
++)) {
"ar: no position operand specified.\n");
/* -d only valid with -Tv. */
if (options
& AR_D
&& options
& ~(AR_D
|AR_TR
|AR_V
))
/* -m only valid with -abiTv. */
if (options
& AR_M
&& options
& ~(AR_A
|AR_B
|AR_M
|AR_TR
|AR_V
))
/* -p only valid with -Tv. */
if (options
& AR_P
&& options
& ~(AR_P
|AR_TR
|AR_V
))
/* -q only valid with -cTv. */
if (options
& AR_Q
&& options
& ~(AR_C
|AR_Q
|AR_TR
|AR_V
))
/* -r only valid with -abcuTv. */
if (options
& AR_R
&& options
& ~(AR_A
|AR_B
|AR_C
|AR_R
|AR_U
|AR_TR
|AR_V
))
/* -t only valid with -Tv. */
if (options
& AR_T
&& options
& ~(AR_T
|AR_TR
|AR_V
))
/* -x only valid with -ouTv. */
if (options
& AR_X
&& options
& ~(AR_O
|AR_U
|AR_TR
|AR_V
|AR_X
))
if (!(archive
= *argv
++)) {
(void)fprintf(stderr
, "ar: no archive specified.\n");
/* -dmqr require a list of archive elements. */
if (options
& (AR_D
|AR_M
|AR_Q
|AR_R
) && !*argv
) {
(void)fprintf(stderr
, "ar: no archive members specified.\n");
"ar: illegal option combination for %s.\n", arg
);
(void)fprintf(stderr
, "usage: ar -d [-Tv] archive file ...\n");
(void)fprintf(stderr
, "\tar -m [-Tv] archive file ...\n");
(void)fprintf(stderr
, "\tar -m [-abiTv] position archive file ...\n");
(void)fprintf(stderr
, "\tar -p [-Tv] archive [file ...]\n");
(void)fprintf(stderr
, "\tar -q [-cTv] archive file ...\n");
(void)fprintf(stderr
, "\tar -r [-cuTv] archive file ...\n");
(void)fprintf(stderr
, "\tar -r [-abciuTv] position archive file ...\n");
(void)fprintf(stderr
, "\tar -t [-Tv] archive [file ...]\n");
(void)fprintf(stderr
, "\tar -x [-ouTv] archive [file ...]\n");