xref: /freebsd/usr.bin/ar/ar.c (revision 1d386b48a555f61cb7325543adbbb5c3f3407a66)
1d192f3d3SKai Wang /*-
2be72428eSEd Maste  * SPDX-License-Identifier: BSD-3-Clause
3be72428eSEd Maste  *
4d192f3d3SKai Wang  * Copyright (c) 2007 Kai Wang
5d192f3d3SKai Wang  * Copyright (c) 2007 Tim Kientzle
6d192f3d3SKai Wang  * Copyright (c) 2007 Joseph Koshy
7d192f3d3SKai Wang  * All rights reserved.
8d192f3d3SKai Wang  *
9d192f3d3SKai Wang  * Redistribution and use in source and binary forms, with or without
10d192f3d3SKai Wang  * modification, are permitted provided that the following conditions
11d192f3d3SKai Wang  * are met:
12d192f3d3SKai Wang  * 1. Redistributions of source code must retain the above copyright
13be72428eSEd Maste  *    notice, this list of conditions and the following disclaimer.
14d192f3d3SKai Wang  * 2. Redistributions in binary form must reproduce the above copyright
15d192f3d3SKai Wang  *    notice, this list of conditions and the following disclaimer in the
16d192f3d3SKai Wang  *    documentation and/or other materials provided with the distribution.
17d192f3d3SKai Wang  *
18be72428eSEd Maste  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19be72428eSEd Maste  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20be72428eSEd Maste  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21be72428eSEd Maste  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22be72428eSEd Maste  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23be72428eSEd Maste  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24be72428eSEd Maste  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25be72428eSEd Maste  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26be72428eSEd Maste  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27be72428eSEd Maste  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28be72428eSEd Maste  * SUCH DAMAGE.
29d192f3d3SKai Wang  */
30d192f3d3SKai Wang 
31d192f3d3SKai Wang /*-
32d192f3d3SKai Wang  * Copyright (c) 1990, 1993, 1994
33d192f3d3SKai Wang  *	The Regents of the University of California.  All rights reserved.
34d192f3d3SKai Wang  *
35d192f3d3SKai Wang  * This code is derived from software contributed to Berkeley by
36d192f3d3SKai Wang  * Hugh Smith at The University of Guelph.
37d192f3d3SKai Wang  *
38d192f3d3SKai Wang  * Redistribution and use in source and binary forms, with or without
39d192f3d3SKai Wang  * modification, are permitted provided that the following conditions
40d192f3d3SKai Wang  * are met:
41d192f3d3SKai Wang  * 1. Redistributions of source code must retain the above copyright
42d192f3d3SKai Wang  *    notice, this list of conditions and the following disclaimer.
43d192f3d3SKai Wang  * 2. Redistributions in binary form must reproduce the above copyright
44d192f3d3SKai Wang  *    notice, this list of conditions and the following disclaimer in the
45d192f3d3SKai Wang  *    documentation and/or other materials provided with the distribution.
46d192f3d3SKai Wang  * 3. Neither the name of the University nor the names of its contributors
47d192f3d3SKai Wang  *    may be used to endorse or promote products derived from this software
48d192f3d3SKai Wang  *    without specific prior written permission.
49d192f3d3SKai Wang  *
50d192f3d3SKai Wang  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
51d192f3d3SKai Wang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
52d192f3d3SKai Wang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
53d192f3d3SKai Wang  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
54d192f3d3SKai Wang  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
55d192f3d3SKai Wang  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
56d192f3d3SKai Wang  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
57d192f3d3SKai Wang  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
58d192f3d3SKai Wang  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
59d192f3d3SKai Wang  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
60d192f3d3SKai Wang  * SUCH DAMAGE.
61d192f3d3SKai Wang  */
62d192f3d3SKai Wang 
63d192f3d3SKai Wang #include <sys/cdefs.h>
64d192f3d3SKai Wang #include <sys/queue.h>
65d192f3d3SKai Wang #include <sys/types.h>
66d192f3d3SKai Wang #include <archive.h>
67edadbb46SEd Maste #include <err.h>
68d192f3d3SKai Wang #include <errno.h>
69d192f3d3SKai Wang #include <getopt.h>
70d192f3d3SKai Wang #include <libgen.h>
71d192f3d3SKai Wang #include <stdio.h>
72d192f3d3SKai Wang #include <stdlib.h>
73d192f3d3SKai Wang #include <string.h>
74d192f3d3SKai Wang 
75d192f3d3SKai Wang #include "ar.h"
76d192f3d3SKai Wang 
77d192f3d3SKai Wang enum options
78d192f3d3SKai Wang {
79d192f3d3SKai Wang 	OPTION_HELP
80d192f3d3SKai Wang };
81d192f3d3SKai Wang 
82d192f3d3SKai Wang static struct option longopts[] =
83d192f3d3SKai Wang {
84d192f3d3SKai Wang 	{"help", no_argument, NULL, OPTION_HELP},
85d192f3d3SKai Wang 	{"version", no_argument, NULL, 'V'},
86d192f3d3SKai Wang 	{NULL, 0, NULL, 0}
87d192f3d3SKai Wang };
88d192f3d3SKai Wang 
89d192f3d3SKai Wang static void	bsdar_usage(void);
90d192f3d3SKai Wang static void	ranlib_usage(void);
91d192f3d3SKai Wang static void	set_mode(struct bsdar *bsdar, char opt);
92d192f3d3SKai Wang static void	only_mode(struct bsdar *bsdar, const char *opt,
93d192f3d3SKai Wang 		    const char *valid_modes);
94d192f3d3SKai Wang static void	bsdar_version(void);
95d192f3d3SKai Wang static void	ranlib_version(void);
96d192f3d3SKai Wang 
97d192f3d3SKai Wang int
main(int argc,char ** argv)98d192f3d3SKai Wang main(int argc, char **argv)
99d192f3d3SKai Wang {
100d192f3d3SKai Wang 	struct bsdar	*bsdar, bsdar_storage;
101d192f3d3SKai Wang 	char		*p;
102d192f3d3SKai Wang 	size_t		 len;
10338911b3cSEd Maste 	int		 exitcode, i, opt, Dflag, Uflag;
104d192f3d3SKai Wang 
105d192f3d3SKai Wang 	bsdar = &bsdar_storage;
106d192f3d3SKai Wang 	memset(bsdar, 0, sizeof(*bsdar));
10738911b3cSEd Maste 	exitcode = EXIT_SUCCESS;
108a80ac30bSEd Maste 	Dflag = 0;
109a80ac30bSEd Maste 	Uflag = 0;
110d192f3d3SKai Wang 
111d192f3d3SKai Wang 	if ((bsdar->progname = getprogname()) == NULL)
112d192f3d3SKai Wang 		bsdar->progname = "ar";
113d192f3d3SKai Wang 
114f05da0e9STim Kientzle 	/* Act like ranlib if our name ends in "ranlib"; this
1156bef5d28SBenedict Reuschling 	 * accommodates arm-freebsd7.1-ranlib, bsdranlib, etc. */
116f05da0e9STim Kientzle 	len = strlen(bsdar->progname);
117f05da0e9STim Kientzle 	if (len >= strlen("ranlib") &&
118f05da0e9STim Kientzle 	    strcmp(bsdar->progname + len - strlen("ranlib"), "ranlib") == 0) {
1197072861cSEd Maste 		while ((opt = getopt_long(argc, argv, "tDUV", longopts,
120d192f3d3SKai Wang 		    NULL)) != -1) {
121d192f3d3SKai Wang 			switch(opt) {
122d192f3d3SKai Wang 			case 't':
123d192f3d3SKai Wang 				/* Ignored. */
124d192f3d3SKai Wang 				break;
125773810fbSKai Wang 			case 'D':
126a80ac30bSEd Maste 				Dflag = 1;
127a80ac30bSEd Maste 				Uflag = 0;
128773810fbSKai Wang 				break;
1297072861cSEd Maste 			case 'U':
130a80ac30bSEd Maste 				Uflag = 1;
131a80ac30bSEd Maste 				Dflag = 0;
1327072861cSEd Maste 				break;
133d192f3d3SKai Wang 			case 'V':
134d192f3d3SKai Wang 				ranlib_version();
135d192f3d3SKai Wang 				break;
136d192f3d3SKai Wang 			case OPTION_HELP:
137d192f3d3SKai Wang 				ranlib_usage();
138d192f3d3SKai Wang 			default:
139d192f3d3SKai Wang 				ranlib_usage();
140d192f3d3SKai Wang 			}
141d192f3d3SKai Wang 		}
142d192f3d3SKai Wang 		argv += optind;
143d192f3d3SKai Wang 		argc -= optind;
144d192f3d3SKai Wang 
145d192f3d3SKai Wang 		if (*argv == NULL)
146d192f3d3SKai Wang 			ranlib_usage();
147d192f3d3SKai Wang 
148a64a36e2SEd Maste 		/* Enable determinstic mode unless -U is set. */
149a64a36e2SEd Maste 		if (Uflag == 0)
150a64a36e2SEd Maste 			bsdar->options |= AR_D;
151d192f3d3SKai Wang 		bsdar->options |= AR_S;
152a84c4d18SEd Maste 		while ((bsdar->filename = *argv++) != NULL)
15357aaefdcSEd Maste 			if (ar_write_archive(bsdar, 's'))
15438911b3cSEd Maste 				exitcode = EXIT_FAILURE;
155d192f3d3SKai Wang 
15638911b3cSEd Maste 		exit(exitcode);
157d192f3d3SKai Wang 	} else {
158d192f3d3SKai Wang 		if (argc < 2)
159d192f3d3SKai Wang 			bsdar_usage();
160d192f3d3SKai Wang 
161d192f3d3SKai Wang 		if (*argv[1] != '-') {
162d192f3d3SKai Wang 			len = strlen(argv[1]) + 2;
163d192f3d3SKai Wang 			if ((p = malloc(len)) == NULL)
164086f0908SEd Maste 				bsdar_errc(bsdar, errno, "malloc failed");
165d192f3d3SKai Wang 			*p = '-';
166d192f3d3SKai Wang 			(void)strlcpy(p + 1, argv[1], len - 1);
167d192f3d3SKai Wang 			argv[1] = p;
168d192f3d3SKai Wang 		}
169d192f3d3SKai Wang 	}
170d192f3d3SKai Wang 
1717072861cSEd Maste 	while ((opt = getopt_long(argc, argv, "abCcdDfijlMmopqrSsTtUuVvxz",
172d192f3d3SKai Wang 	    longopts, NULL)) != -1) {
173d192f3d3SKai Wang 		switch(opt) {
174d192f3d3SKai Wang 		case 'a':
175d192f3d3SKai Wang 			bsdar->options |= AR_A;
176d192f3d3SKai Wang 			break;
177d192f3d3SKai Wang 		case 'b':
178d192f3d3SKai Wang 		case 'i':
179d192f3d3SKai Wang 			bsdar->options |= AR_B;
180d192f3d3SKai Wang 			break;
181d192f3d3SKai Wang 		case 'C':
182d192f3d3SKai Wang 			bsdar->options |= AR_CC;
183d192f3d3SKai Wang 			break;
184d192f3d3SKai Wang 		case 'c':
185d192f3d3SKai Wang 			bsdar->options |= AR_C;
186d192f3d3SKai Wang 			break;
187d192f3d3SKai Wang 		case 'd':
188d192f3d3SKai Wang 			set_mode(bsdar, opt);
189d192f3d3SKai Wang 			break;
1900e479ac8STim Kientzle 		case 'D':
191a80ac30bSEd Maste 			Dflag = 1;
192a80ac30bSEd Maste 			Uflag = 0;
1930e479ac8STim Kientzle 			break;
194d192f3d3SKai Wang 		case 'f':
195d192f3d3SKai Wang 			bsdar->options |= AR_TR;
196d192f3d3SKai Wang 			break;
197d192f3d3SKai Wang 		case 'j':
1985dfab45bSKai Wang 			/* ignored */
199d192f3d3SKai Wang 			break;
200d192f3d3SKai Wang 		case 'l':
201d192f3d3SKai Wang 			/* ignored, for GNU ar comptibility */
202d192f3d3SKai Wang 			break;
2030c099281SKai Wang 		case 'M':
2040c099281SKai Wang 			set_mode(bsdar, opt);
2050c099281SKai Wang 			break;
206d192f3d3SKai Wang 		case 'm':
207d192f3d3SKai Wang 			set_mode(bsdar, opt);
208d192f3d3SKai Wang 			break;
209d192f3d3SKai Wang 		case 'o':
210d192f3d3SKai Wang 			bsdar->options |= AR_O;
211d192f3d3SKai Wang 			break;
212d192f3d3SKai Wang 		case 'p':
213d192f3d3SKai Wang 			set_mode(bsdar, opt);
214d192f3d3SKai Wang 			break;
215d192f3d3SKai Wang 		case 'q':
216d192f3d3SKai Wang 			set_mode(bsdar, opt);
217d192f3d3SKai Wang 			break;
218d192f3d3SKai Wang 		case 'r':
219d192f3d3SKai Wang 			set_mode(bsdar, opt);
220d192f3d3SKai Wang 			break;
221d192f3d3SKai Wang 		case 'S':
222d192f3d3SKai Wang 			bsdar->options |= AR_SS;
223d192f3d3SKai Wang 			break;
224d192f3d3SKai Wang 		case 's':
225d192f3d3SKai Wang 			bsdar->options |= AR_S;
226d192f3d3SKai Wang 			break;
227edadbb46SEd Maste 		case 'T':
2281a0a41b1SEd Maste 			/* ignored */
229edadbb46SEd Maste 			break;
230d192f3d3SKai Wang 		case 't':
231d192f3d3SKai Wang 			set_mode(bsdar, opt);
232d192f3d3SKai Wang 			break;
2337072861cSEd Maste 		case 'U':
234a80ac30bSEd Maste 			Uflag = 1;
235a80ac30bSEd Maste 			Dflag = 0;
2367072861cSEd Maste 			break;
237d192f3d3SKai Wang 		case 'u':
238d192f3d3SKai Wang 			bsdar->options |= AR_U;
239d192f3d3SKai Wang 			break;
240d192f3d3SKai Wang 		case 'V':
241d192f3d3SKai Wang 			bsdar_version();
242d192f3d3SKai Wang 			break;
243d192f3d3SKai Wang 		case 'v':
244d192f3d3SKai Wang 			bsdar->options |= AR_V;
245d192f3d3SKai Wang 			break;
246d192f3d3SKai Wang 		case 'x':
247d192f3d3SKai Wang 			set_mode(bsdar, opt);
248d192f3d3SKai Wang 			break;
249d192f3d3SKai Wang 		case 'z':
2505dfab45bSKai Wang 			/* ignored */
251d192f3d3SKai Wang 			break;
252d192f3d3SKai Wang 		case OPTION_HELP:
253d192f3d3SKai Wang 			bsdar_usage();
254d192f3d3SKai Wang 		default:
255d192f3d3SKai Wang 			bsdar_usage();
256d192f3d3SKai Wang 		}
257d192f3d3SKai Wang 	}
258d192f3d3SKai Wang 
259d192f3d3SKai Wang 	argv += optind;
260d192f3d3SKai Wang 	argc -= optind;
261d192f3d3SKai Wang 
2620c099281SKai Wang 	if (*argv == NULL && bsdar->mode != 'M')
263d192f3d3SKai Wang 		bsdar_usage();
264d192f3d3SKai Wang 
265d192f3d3SKai Wang 	if (bsdar->options & AR_A && bsdar->options & AR_B)
266086f0908SEd Maste 		bsdar_errc(bsdar, 0,
267d192f3d3SKai Wang 		    "only one of -a and -[bi] options allowed");
268d192f3d3SKai Wang 
269d192f3d3SKai Wang 	if (bsdar->options & AR_J && bsdar->options & AR_Z)
270086f0908SEd Maste 		bsdar_errc(bsdar, 0, "only one of -j and -z options allowed");
271d192f3d3SKai Wang 
272d192f3d3SKai Wang 	if (bsdar->options & AR_S && bsdar->options & AR_SS)
273086f0908SEd Maste 		bsdar_errc(bsdar, 0, "only one of -s and -S options allowed");
274d192f3d3SKai Wang 
275d192f3d3SKai Wang 	if (bsdar->options & (AR_A | AR_B)) {
276c76f604eSEd Schouten 		if (*argv == NULL)
277086f0908SEd Maste 			bsdar_errc(bsdar, 0, "no position operand specified");
278c76f604eSEd Schouten 		if ((bsdar->posarg = basename(*argv)) == NULL)
279086f0908SEd Maste 			bsdar_errc(bsdar, errno, "basename failed");
280d192f3d3SKai Wang 		argc--;
281d192f3d3SKai Wang 		argv++;
282d192f3d3SKai Wang 	}
283d192f3d3SKai Wang 
284a80ac30bSEd Maste 	/* Set determinstic mode for -D, and by default without -U. */
28511c4d924SEd Maste 	if (Dflag || (Uflag == 0 && (bsdar->mode == 'q' || bsdar->mode == 'r' ||
28611c4d924SEd Maste 	    (bsdar->mode == '\0' && bsdar->options & AR_S))))
287a80ac30bSEd Maste 		bsdar->options |= AR_D;
288a80ac30bSEd Maste 
289d192f3d3SKai Wang 	if (bsdar->options & AR_A)
290d192f3d3SKai Wang 		only_mode(bsdar, "-a", "mqr");
291d192f3d3SKai Wang 	if (bsdar->options & AR_B)
292d192f3d3SKai Wang 		only_mode(bsdar, "-b", "mqr");
293d192f3d3SKai Wang 	if (bsdar->options & AR_C)
294d192f3d3SKai Wang 		only_mode(bsdar, "-c", "qr");
295d192f3d3SKai Wang 	if (bsdar->options & AR_CC)
296d192f3d3SKai Wang 		only_mode(bsdar, "-C", "x");
297a80ac30bSEd Maste 	if (Dflag)
2980e479ac8STim Kientzle 		only_mode(bsdar, "-D", "qr");
299a80ac30bSEd Maste 	if (Uflag)
300a80ac30bSEd Maste 		only_mode(bsdar, "-U", "qr");
301d192f3d3SKai Wang 	if (bsdar->options & AR_O)
302d192f3d3SKai Wang 		only_mode(bsdar, "-o", "x");
303d192f3d3SKai Wang 	if (bsdar->options & AR_SS)
304d192f3d3SKai Wang 		only_mode(bsdar, "-S", "mqr");
305d192f3d3SKai Wang 	if (bsdar->options & AR_U)
306d192f3d3SKai Wang 		only_mode(bsdar, "-u", "qrx");
307d192f3d3SKai Wang 
3080c099281SKai Wang 	if (bsdar->mode == 'M') {
3090c099281SKai Wang 		ar_mode_script(bsdar);
31038911b3cSEd Maste 		exit(EXIT_SUCCESS);
3110c099281SKai Wang 	}
3120c099281SKai Wang 
313d192f3d3SKai Wang 	if ((bsdar->filename = *argv) == NULL)
314d192f3d3SKai Wang 		bsdar_usage();
315d192f3d3SKai Wang 
316d192f3d3SKai Wang 	bsdar->argc = --argc;
317d192f3d3SKai Wang 	bsdar->argv = ++argv;
318d192f3d3SKai Wang 
319d192f3d3SKai Wang 	if ((!bsdar->mode || strchr("ptx", bsdar->mode)) &&
320d192f3d3SKai Wang 	    bsdar->options & AR_S) {
32157aaefdcSEd Maste 		exitcode = ar_write_archive(bsdar, 's');
322d192f3d3SKai Wang 		if (!bsdar->mode)
32338911b3cSEd Maste 			exit(exitcode);
324d192f3d3SKai Wang 	}
325d192f3d3SKai Wang 
326d192f3d3SKai Wang 	switch(bsdar->mode) {
32757aaefdcSEd Maste 	case 'd': case 'm': case 'q': case 'r':
32857aaefdcSEd Maste 		exitcode = ar_write_archive(bsdar, bsdar->mode);
329d192f3d3SKai Wang 		break;
33057aaefdcSEd Maste 	case 'p': case 't': case 'x':
331*41e6398fSMark Johnston 		exitcode = ar_read_archive(bsdar, bsdar->mode, stdout);
332d192f3d3SKai Wang 		break;
333d192f3d3SKai Wang 	default:
334d192f3d3SKai Wang 		bsdar_usage();
335d192f3d3SKai Wang 		/* NOTREACHED */
336d192f3d3SKai Wang 	}
337d192f3d3SKai Wang 
33838911b3cSEd Maste 	for (i = 0; i < bsdar->argc; i++) {
33938911b3cSEd Maste 		if (bsdar->argv[i] != NULL) {
340d192f3d3SKai Wang 			bsdar_warnc(bsdar, 0, "%s: not found in archive",
341d192f3d3SKai Wang 			    bsdar->argv[i]);
34238911b3cSEd Maste 			exitcode = EXIT_FAILURE;
34338911b3cSEd Maste 		}
34438911b3cSEd Maste 	}
345d192f3d3SKai Wang 
34638911b3cSEd Maste 	exit(exitcode);
347d192f3d3SKai Wang }
348d192f3d3SKai Wang 
349d192f3d3SKai Wang static void
set_mode(struct bsdar * bsdar,char opt)350d192f3d3SKai Wang set_mode(struct bsdar *bsdar, char opt)
351d192f3d3SKai Wang {
352d192f3d3SKai Wang 
353d192f3d3SKai Wang 	if (bsdar->mode != '\0' && bsdar->mode != opt)
354086f0908SEd Maste 		bsdar_errc(bsdar, 0, "Can't specify both -%c and -%c", opt,
355086f0908SEd Maste 		    bsdar->mode);
356d192f3d3SKai Wang 	bsdar->mode = opt;
357d192f3d3SKai Wang }
358d192f3d3SKai Wang 
359d192f3d3SKai Wang static void
only_mode(struct bsdar * bsdar,const char * opt,const char * valid_modes)360d192f3d3SKai Wang only_mode(struct bsdar *bsdar, const char *opt, const char *valid_modes)
361d192f3d3SKai Wang {
362d192f3d3SKai Wang 
363d192f3d3SKai Wang 	if (strchr(valid_modes, bsdar->mode) == NULL)
364086f0908SEd Maste 		bsdar_errc(bsdar, 0, "Option %s is not permitted in mode -%c",
365086f0908SEd Maste 		    opt, bsdar->mode);
366d192f3d3SKai Wang }
367d192f3d3SKai Wang 
368d192f3d3SKai Wang static void
bsdar_usage(void)369ef636796SEd Schouten bsdar_usage(void)
370d192f3d3SKai Wang {
371d192f3d3SKai Wang 
372d192f3d3SKai Wang 	(void)fprintf(stderr, "usage:  ar -d [-Tjsvz] archive file ...\n");
373d192f3d3SKai Wang 	(void)fprintf(stderr, "\tar -m [-Tjsvz] archive file ...\n");
374d192f3d3SKai Wang 	(void)fprintf(stderr, "\tar -m [-Tabijsvz] position archive file ...\n");
375d192f3d3SKai Wang 	(void)fprintf(stderr, "\tar -p [-Tv] archive [file ...]\n");
3767072861cSEd Maste 	(void)fprintf(stderr, "\tar -q [-TcDjsUvz] archive file ...\n");
3777072861cSEd Maste 	(void)fprintf(stderr, "\tar -r [-TcDjsUuvz] archive file ...\n");
3787072861cSEd Maste 	(void)fprintf(stderr, "\tar -r [-TabcDijsUuvz] position archive file ...\n");
379d192f3d3SKai Wang 	(void)fprintf(stderr, "\tar -s [-jz] archive\n");
380d192f3d3SKai Wang 	(void)fprintf(stderr, "\tar -t [-Tv] archive [file ...]\n");
381d192f3d3SKai Wang 	(void)fprintf(stderr, "\tar -x [-CTouv] archive [file ...]\n");
382d192f3d3SKai Wang 	(void)fprintf(stderr, "\tar -V\n");
38338911b3cSEd Maste 	exit(EXIT_FAILURE);
384d192f3d3SKai Wang }
385d192f3d3SKai Wang 
386d192f3d3SKai Wang static void
ranlib_usage(void)387ef636796SEd Schouten ranlib_usage(void)
388d192f3d3SKai Wang {
389d192f3d3SKai Wang 
3907072861cSEd Maste 	(void)fprintf(stderr, "usage:	ranlib [-DtU] archive ...\n");
391d192f3d3SKai Wang 	(void)fprintf(stderr, "\tranlib -V\n");
39238911b3cSEd Maste 	exit(EXIT_FAILURE);
393d192f3d3SKai Wang }
394d192f3d3SKai Wang 
395d192f3d3SKai Wang static void
bsdar_version(void)396ef636796SEd Schouten bsdar_version(void)
397d192f3d3SKai Wang {
3986c95142eSMartin Matuska 	(void)printf("BSD ar %s - %s\n", BSDAR_VERSION, archive_version_string());
39938911b3cSEd Maste 	exit(EXIT_SUCCESS);
400d192f3d3SKai Wang }
401d192f3d3SKai Wang 
402d192f3d3SKai Wang static void
ranlib_version(void)403ef636796SEd Schouten ranlib_version(void)
404d192f3d3SKai Wang {
4056c95142eSMartin Matuska 	(void)printf("ranlib %s - %s\n", BSDAR_VERSION, archive_version_string());
40638911b3cSEd Maste 	exit(EXIT_SUCCESS);
407d192f3d3SKai Wang }
408