* Copyright (c) 1990 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* Hugh Smith at The University of Guelph.
* %sccs.include.redist.c%
"@(#) Copyright (c) 1990 The Regents of the University of California.\n\
static char sccsid
[] = "@(#)ar.c 5.8 (Berkeley) %G%";
char *archive
, *envtmp
, *posarg
, *posname
;
* 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
, "abcdilmopqrstuvx")) != 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 -sv. */
if (options
& AR_D
&& options
& ~(AR_D
|AR_S
|AR_V
))
/* -m only valid with -abisv. */
if (options
& AR_M
&& options
& ~(AR_A
|AR_B
|AR_M
|AR_S
|AR_V
))
/* -p only valid with -sv. */
if (options
& AR_P
&& options
& ~(AR_P
|AR_S
|AR_V
))
/* -q only valid with -csv. */
if (options
& AR_Q
&& options
& ~(AR_C
|AR_Q
|AR_S
|AR_V
))
/* -r only valid with -abcusv. */
if (options
& AR_R
&& options
& ~(AR_A
|AR_B
|AR_C
|AR_R
|AR_U
|AR_S
|AR_V
))
/* -t only valid with -sv. */
if (options
& AR_T
&& options
& ~(AR_T
|AR_S
|AR_V
))
/* -x only valid with -ousv. */
if (options
& AR_X
&& options
& ~(AR_O
|AR_U
|AR_S
|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 [-sv] archive file ...\n");
(void)fprintf(stderr
, "\tar -m [-sv] archive file ...\n");
(void)fprintf(stderr
, "\tar -m [-abisv] position archive file ...\n");
(void)fprintf(stderr
, "\tar -p [-sv] archive [file ...]\n");
(void)fprintf(stderr
, "\tar -q [-csv] archive file ...\n");
(void)fprintf(stderr
, "\tar -r [-cusv] archive file ...\n");
(void)fprintf(stderr
, "\tar -r [-abciusv] position archive file ...\n");
(void)fprintf(stderr
, "\tar -t [-sv] archive [file ...]\n");
(void)fprintf(stderr
, "\tar -x [-ousv] archive [file ...]\n");