* 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.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
"@(#) Copyright (c) 1990 The Regents of the University of California.\n\
static char sccsid
[] = "@(#)ar.c 5.11 (Berkeley) 3/21/91";
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");