xref: /freebsd/usr.bin/ar/ar.c (revision 773810fb454b73e2ff6d5817ffbcd1ba84b21ef2)
1d192f3d3SKai Wang /*-
2d192f3d3SKai Wang  * Copyright (c) 2007 Kai Wang
3d192f3d3SKai Wang  * Copyright (c) 2007 Tim Kientzle
4d192f3d3SKai Wang  * Copyright (c) 2007 Joseph Koshy
5d192f3d3SKai Wang  * All rights reserved.
6d192f3d3SKai Wang  *
7d192f3d3SKai Wang  * Redistribution and use in source and binary forms, with or without
8d192f3d3SKai Wang  * modification, are permitted provided that the following conditions
9d192f3d3SKai Wang  * are met:
10d192f3d3SKai Wang  * 1. Redistributions of source code must retain the above copyright
11d192f3d3SKai Wang  *    notice, this list of conditions and the following disclaimer
12d192f3d3SKai Wang  *    in this position and unchanged.
13d192f3d3SKai Wang  * 2. Redistributions in binary form must reproduce the above copyright
14d192f3d3SKai Wang  *    notice, this list of conditions and the following disclaimer in the
15d192f3d3SKai Wang  *    documentation and/or other materials provided with the distribution.
16d192f3d3SKai Wang  *
17d192f3d3SKai Wang  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
18d192f3d3SKai Wang  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19d192f3d3SKai Wang  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20d192f3d3SKai Wang  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
21d192f3d3SKai Wang  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22d192f3d3SKai Wang  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23d192f3d3SKai Wang  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24d192f3d3SKai Wang  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25d192f3d3SKai Wang  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26d192f3d3SKai Wang  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27d192f3d3SKai Wang  */
28d192f3d3SKai Wang 
29d192f3d3SKai Wang /*-
30d192f3d3SKai Wang  * Copyright (c) 1990, 1993, 1994
31d192f3d3SKai Wang  *	The Regents of the University of California.  All rights reserved.
32d192f3d3SKai Wang  *
33d192f3d3SKai Wang  * This code is derived from software contributed to Berkeley by
34d192f3d3SKai Wang  * Hugh Smith at The University of Guelph.
35d192f3d3SKai Wang  *
36d192f3d3SKai Wang  * Redistribution and use in source and binary forms, with or without
37d192f3d3SKai Wang  * modification, are permitted provided that the following conditions
38d192f3d3SKai Wang  * are met:
39d192f3d3SKai Wang  * 1. Redistributions of source code must retain the above copyright
40d192f3d3SKai Wang  *    notice, this list of conditions and the following disclaimer.
41d192f3d3SKai Wang  * 2. Redistributions in binary form must reproduce the above copyright
42d192f3d3SKai Wang  *    notice, this list of conditions and the following disclaimer in the
43d192f3d3SKai Wang  *    documentation and/or other materials provided with the distribution.
44d192f3d3SKai Wang  * 3. Neither the name of the University nor the names of its contributors
45d192f3d3SKai Wang  *    may be used to endorse or promote products derived from this software
46d192f3d3SKai Wang  *    without specific prior written permission.
47d192f3d3SKai Wang  *
48d192f3d3SKai Wang  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
49d192f3d3SKai Wang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50d192f3d3SKai Wang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51d192f3d3SKai Wang  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
52d192f3d3SKai Wang  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53d192f3d3SKai Wang  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54d192f3d3SKai Wang  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55d192f3d3SKai Wang  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56d192f3d3SKai Wang  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57d192f3d3SKai Wang  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58d192f3d3SKai Wang  * SUCH DAMAGE.
59d192f3d3SKai Wang  */
60d192f3d3SKai Wang 
61d192f3d3SKai Wang #include <sys/cdefs.h>
62d192f3d3SKai Wang __FBSDID("$FreeBSD$");
63d192f3d3SKai Wang 
64d192f3d3SKai Wang #include <sys/queue.h>
65d192f3d3SKai Wang #include <sys/types.h>
66d192f3d3SKai Wang #include <archive.h>
67d192f3d3SKai Wang #include <errno.h>
68d192f3d3SKai Wang #include <getopt.h>
69d192f3d3SKai Wang #include <libgen.h>
70d192f3d3SKai Wang #include <stdio.h>
71d192f3d3SKai Wang #include <stdlib.h>
72d192f3d3SKai Wang #include <string.h>
73d192f3d3SKai Wang #include <sysexits.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
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;
103d192f3d3SKai Wang 	int		 i, opt;
104d192f3d3SKai Wang 
105d192f3d3SKai Wang 	bsdar = &bsdar_storage;
106d192f3d3SKai Wang 	memset(bsdar, 0, sizeof(*bsdar));
107d192f3d3SKai Wang 
108d192f3d3SKai Wang 	if ((bsdar->progname = getprogname()) == NULL)
109d192f3d3SKai Wang 		bsdar->progname = "ar";
110d192f3d3SKai Wang 
111f05da0e9STim Kientzle 	/* Act like ranlib if our name ends in "ranlib"; this
112f05da0e9STim Kientzle 	 * accomodates arm-freebsd7.1-ranlib, bsdranlib, etc. */
113f05da0e9STim Kientzle 	len = strlen(bsdar->progname);
114f05da0e9STim Kientzle 	if (len >= strlen("ranlib") &&
115f05da0e9STim Kientzle 	    strcmp(bsdar->progname + len - strlen("ranlib"), "ranlib") == 0) {
116*773810fbSKai Wang 		while ((opt = getopt_long(argc, argv, "tDV", longopts,
117d192f3d3SKai Wang 		    NULL)) != -1) {
118d192f3d3SKai Wang 			switch(opt) {
119d192f3d3SKai Wang 			case 't':
120d192f3d3SKai Wang 				/* Ignored. */
121d192f3d3SKai Wang 				break;
122*773810fbSKai Wang 			case 'D':
123*773810fbSKai Wang 				bsdar->options |= AR_D;
124*773810fbSKai Wang 				break;
125d192f3d3SKai Wang 			case 'V':
126d192f3d3SKai Wang 				ranlib_version();
127d192f3d3SKai Wang 				break;
128d192f3d3SKai Wang 			case OPTION_HELP:
129d192f3d3SKai Wang 				ranlib_usage();
130d192f3d3SKai Wang 			default:
131d192f3d3SKai Wang 				ranlib_usage();
132d192f3d3SKai Wang 			}
133d192f3d3SKai Wang 		}
134d192f3d3SKai Wang 		argv += optind;
135d192f3d3SKai Wang 		argc -= optind;
136d192f3d3SKai Wang 
137d192f3d3SKai Wang 		if (*argv == NULL)
138d192f3d3SKai Wang 			ranlib_usage();
139d192f3d3SKai Wang 
140d192f3d3SKai Wang 		bsdar->options |= AR_S;
141d192f3d3SKai Wang 		for (;(bsdar->filename = *argv++) != NULL;)
142d192f3d3SKai Wang 			ar_mode_s(bsdar);
143d192f3d3SKai Wang 
144d192f3d3SKai Wang 		exit(EX_OK);
145d192f3d3SKai Wang 	} else {
146d192f3d3SKai Wang 		if (argc < 2)
147d192f3d3SKai Wang 			bsdar_usage();
148d192f3d3SKai Wang 
149d192f3d3SKai Wang 		if (*argv[1] != '-') {
150d192f3d3SKai Wang 			len = strlen(argv[1]) + 2;
151d192f3d3SKai Wang 			if ((p = malloc(len)) == NULL)
152d192f3d3SKai Wang 				bsdar_errc(bsdar, EX_SOFTWARE, errno,
153d192f3d3SKai Wang 				    "malloc failed");
154d192f3d3SKai Wang 			*p = '-';
155d192f3d3SKai Wang 			(void)strlcpy(p + 1, argv[1], len - 1);
156d192f3d3SKai Wang 			argv[1] = p;
157d192f3d3SKai Wang 		}
158d192f3d3SKai Wang 	}
159d192f3d3SKai Wang 
1600e479ac8STim Kientzle 	while ((opt = getopt_long(argc, argv, "abCcdDfijlMmopqrSsTtuVvxz",
161d192f3d3SKai Wang 	    longopts, NULL)) != -1) {
162d192f3d3SKai Wang 		switch(opt) {
163d192f3d3SKai Wang 		case 'a':
164d192f3d3SKai Wang 			bsdar->options |= AR_A;
165d192f3d3SKai Wang 			break;
166d192f3d3SKai Wang 		case 'b':
167d192f3d3SKai Wang 		case 'i':
168d192f3d3SKai Wang 			bsdar->options |= AR_B;
169d192f3d3SKai Wang 			break;
170d192f3d3SKai Wang 		case 'C':
171d192f3d3SKai Wang 			bsdar->options |= AR_CC;
172d192f3d3SKai Wang 			break;
173d192f3d3SKai Wang 		case 'c':
174d192f3d3SKai Wang 			bsdar->options |= AR_C;
175d192f3d3SKai Wang 			break;
176d192f3d3SKai Wang 		case 'd':
177d192f3d3SKai Wang 			set_mode(bsdar, opt);
178d192f3d3SKai Wang 			break;
1790e479ac8STim Kientzle 		case 'D':
1800e479ac8STim Kientzle 			bsdar->options |= AR_D;
1810e479ac8STim Kientzle 			break;
182d192f3d3SKai Wang 		case 'f':
183d192f3d3SKai Wang 		case 'T':
184d192f3d3SKai Wang 			bsdar->options |= AR_TR;
185d192f3d3SKai Wang 			break;
186d192f3d3SKai Wang 		case 'j':
1875dfab45bSKai Wang 			/* ignored */
188d192f3d3SKai Wang 			break;
189d192f3d3SKai Wang 		case 'l':
190d192f3d3SKai Wang 			/* ignored, for GNU ar comptibility */
191d192f3d3SKai Wang 			break;
1920c099281SKai Wang 		case 'M':
1930c099281SKai Wang 			set_mode(bsdar, opt);
1940c099281SKai Wang 			break;
195d192f3d3SKai Wang 		case 'm':
196d192f3d3SKai Wang 			set_mode(bsdar, opt);
197d192f3d3SKai Wang 			break;
198d192f3d3SKai Wang 		case 'o':
199d192f3d3SKai Wang 			bsdar->options |= AR_O;
200d192f3d3SKai Wang 			break;
201d192f3d3SKai Wang 		case 'p':
202d192f3d3SKai Wang 			set_mode(bsdar, opt);
203d192f3d3SKai Wang 			break;
204d192f3d3SKai Wang 		case 'q':
205d192f3d3SKai Wang 			set_mode(bsdar, opt);
206d192f3d3SKai Wang 			break;
207d192f3d3SKai Wang 		case 'r':
208d192f3d3SKai Wang 			set_mode(bsdar, opt);
209d192f3d3SKai Wang 			break;
210d192f3d3SKai Wang 		case 'S':
211d192f3d3SKai Wang 			bsdar->options |= AR_SS;
212d192f3d3SKai Wang 			break;
213d192f3d3SKai Wang 		case 's':
214d192f3d3SKai Wang 			bsdar->options |= AR_S;
215d192f3d3SKai Wang 			break;
216d192f3d3SKai Wang 		case 't':
217d192f3d3SKai Wang 			set_mode(bsdar, opt);
218d192f3d3SKai Wang 			break;
219d192f3d3SKai Wang 		case 'u':
220d192f3d3SKai Wang 			bsdar->options |= AR_U;
221d192f3d3SKai Wang 			break;
222d192f3d3SKai Wang 		case 'V':
223d192f3d3SKai Wang 			bsdar_version();
224d192f3d3SKai Wang 			break;
225d192f3d3SKai Wang 		case 'v':
226d192f3d3SKai Wang 			bsdar->options |= AR_V;
227d192f3d3SKai Wang 			break;
228d192f3d3SKai Wang 		case 'x':
229d192f3d3SKai Wang 			set_mode(bsdar, opt);
230d192f3d3SKai Wang 			break;
231d192f3d3SKai Wang 		case 'z':
2325dfab45bSKai Wang 			/* ignored */
233d192f3d3SKai Wang 			break;
234d192f3d3SKai Wang 		case OPTION_HELP:
235d192f3d3SKai Wang 			bsdar_usage();
236d192f3d3SKai Wang 		default:
237d192f3d3SKai Wang 			bsdar_usage();
238d192f3d3SKai Wang 		}
239d192f3d3SKai Wang 	}
240d192f3d3SKai Wang 
241d192f3d3SKai Wang 	argv += optind;
242d192f3d3SKai Wang 	argc -= optind;
243d192f3d3SKai Wang 
2440c099281SKai Wang 	if (*argv == NULL && bsdar->mode != 'M')
245d192f3d3SKai Wang 		bsdar_usage();
246d192f3d3SKai Wang 
247d192f3d3SKai Wang 	if (bsdar->options & AR_A && bsdar->options & AR_B)
248d192f3d3SKai Wang 		bsdar_errc(bsdar, EX_USAGE, 0,
249d192f3d3SKai Wang 		    "only one of -a and -[bi] options allowed");
250d192f3d3SKai Wang 
251d192f3d3SKai Wang 	if (bsdar->options & AR_J && bsdar->options & AR_Z)
252d192f3d3SKai Wang 		bsdar_errc(bsdar, EX_USAGE, 0,
253d192f3d3SKai Wang 		    "only one of -j and -z options allowed");
254d192f3d3SKai Wang 
255d192f3d3SKai Wang 	if (bsdar->options & AR_S && bsdar->options & AR_SS)
256d192f3d3SKai Wang 		bsdar_errc(bsdar, EX_USAGE, 0,
257d192f3d3SKai Wang 		    "only one of -s and -S options allowed");
258d192f3d3SKai Wang 
259d192f3d3SKai Wang 	if (bsdar->options & (AR_A | AR_B)) {
260d192f3d3SKai Wang 		if ((bsdar->posarg = *argv) == NULL)
261d192f3d3SKai Wang 			bsdar_errc(bsdar, EX_USAGE, 0,
262d192f3d3SKai Wang 			    "no position operand specified");
263d192f3d3SKai Wang 		if ((bsdar->posarg = basename(bsdar->posarg)) == NULL)
264d192f3d3SKai Wang 			bsdar_errc(bsdar, EX_SOFTWARE, errno,
265d192f3d3SKai Wang 			    "basename failed");
266d192f3d3SKai Wang 		argc--;
267d192f3d3SKai Wang 		argv++;
268d192f3d3SKai Wang 	}
269d192f3d3SKai Wang 
270d192f3d3SKai Wang 	if (bsdar->options & AR_A)
271d192f3d3SKai Wang 		only_mode(bsdar, "-a", "mqr");
272d192f3d3SKai Wang 	if (bsdar->options & AR_B)
273d192f3d3SKai Wang 		only_mode(bsdar, "-b", "mqr");
274d192f3d3SKai Wang 	if (bsdar->options & AR_C)
275d192f3d3SKai Wang 		only_mode(bsdar, "-c", "qr");
276d192f3d3SKai Wang 	if (bsdar->options & AR_CC)
277d192f3d3SKai Wang 		only_mode(bsdar, "-C", "x");
2780e479ac8STim Kientzle 	if (bsdar->options & AR_D)
2790e479ac8STim Kientzle 		only_mode(bsdar, "-D", "qr");
280d192f3d3SKai Wang 	if (bsdar->options & AR_O)
281d192f3d3SKai Wang 		only_mode(bsdar, "-o", "x");
282d192f3d3SKai Wang 	if (bsdar->options & AR_SS)
283d192f3d3SKai Wang 		only_mode(bsdar, "-S", "mqr");
284d192f3d3SKai Wang 	if (bsdar->options & AR_U)
285d192f3d3SKai Wang 		only_mode(bsdar, "-u", "qrx");
286d192f3d3SKai Wang 
2870c099281SKai Wang 	if (bsdar->mode == 'M') {
2880c099281SKai Wang 		ar_mode_script(bsdar);
2890c099281SKai Wang 		exit(EX_OK);
2900c099281SKai Wang 	}
2910c099281SKai Wang 
292d192f3d3SKai Wang 	if ((bsdar->filename = *argv) == NULL)
293d192f3d3SKai Wang 		bsdar_usage();
294d192f3d3SKai Wang 
295d192f3d3SKai Wang 	bsdar->argc = --argc;
296d192f3d3SKai Wang 	bsdar->argv = ++argv;
297d192f3d3SKai Wang 
298d192f3d3SKai Wang 	if ((!bsdar->mode || strchr("ptx", bsdar->mode)) &&
299d192f3d3SKai Wang 	    bsdar->options & AR_S) {
300d192f3d3SKai Wang 		ar_mode_s(bsdar);
301d192f3d3SKai Wang 		if (!bsdar->mode)
302d192f3d3SKai Wang 			exit(EX_OK);
303d192f3d3SKai Wang 	}
304d192f3d3SKai Wang 
305d192f3d3SKai Wang 	switch(bsdar->mode) {
306d192f3d3SKai Wang 	case 'd':
307d192f3d3SKai Wang 		ar_mode_d(bsdar);
308d192f3d3SKai Wang 		break;
309d192f3d3SKai Wang 	case 'm':
310d192f3d3SKai Wang 		ar_mode_m(bsdar);
311d192f3d3SKai Wang 		break;
312d192f3d3SKai Wang 	case 'p':
313d192f3d3SKai Wang 		ar_mode_p(bsdar);
314d192f3d3SKai Wang 		break;
315d192f3d3SKai Wang 	case 'q':
316cb0dad38SKai Wang 		ar_mode_q(bsdar);
317d192f3d3SKai Wang 		break;
318d192f3d3SKai Wang 	case 'r':
319d192f3d3SKai Wang 		ar_mode_r(bsdar);
320d192f3d3SKai Wang 		break;
321d192f3d3SKai Wang 	case 't':
322d192f3d3SKai Wang 		ar_mode_t(bsdar);
323d192f3d3SKai Wang 		break;
324d192f3d3SKai Wang 	case 'x':
325d192f3d3SKai Wang 		ar_mode_x(bsdar);
326d192f3d3SKai Wang 		break;
327d192f3d3SKai Wang 	default:
328d192f3d3SKai Wang 		bsdar_usage();
329d192f3d3SKai Wang 		/* NOTREACHED */
330d192f3d3SKai Wang 	}
331d192f3d3SKai Wang 
332d192f3d3SKai Wang 	for (i = 0; i < bsdar->argc; i++)
333d192f3d3SKai Wang 		if (bsdar->argv[i] != NULL)
334d192f3d3SKai Wang 			bsdar_warnc(bsdar, 0, "%s: not found in archive",
335d192f3d3SKai Wang 			    bsdar->argv[i]);
336d192f3d3SKai Wang 
337d192f3d3SKai Wang 	exit(EX_OK);
338d192f3d3SKai Wang }
339d192f3d3SKai Wang 
340d192f3d3SKai Wang static void
341d192f3d3SKai Wang set_mode(struct bsdar *bsdar, char opt)
342d192f3d3SKai Wang {
343d192f3d3SKai Wang 
344d192f3d3SKai Wang 	if (bsdar->mode != '\0' && bsdar->mode != opt)
345d192f3d3SKai Wang 		bsdar_errc(bsdar, EX_USAGE, 0,
346d192f3d3SKai Wang 		    "Can't specify both -%c and -%c", opt, bsdar->mode);
347d192f3d3SKai Wang 	bsdar->mode = opt;
348d192f3d3SKai Wang }
349d192f3d3SKai Wang 
350d192f3d3SKai Wang static void
351d192f3d3SKai Wang only_mode(struct bsdar *bsdar, const char *opt, const char *valid_modes)
352d192f3d3SKai Wang {
353d192f3d3SKai Wang 
354d192f3d3SKai Wang 	if (strchr(valid_modes, bsdar->mode) == NULL)
355d192f3d3SKai Wang 		bsdar_errc(bsdar, EX_USAGE, 0,
356d192f3d3SKai Wang 		    "Option %s is not permitted in mode -%c", opt, bsdar->mode);
357d192f3d3SKai Wang }
358d192f3d3SKai Wang 
359d192f3d3SKai Wang static void
360ef636796SEd Schouten bsdar_usage(void)
361d192f3d3SKai Wang {
362d192f3d3SKai Wang 
363d192f3d3SKai Wang 	(void)fprintf(stderr, "usage:  ar -d [-Tjsvz] archive file ...\n");
364d192f3d3SKai Wang 	(void)fprintf(stderr, "\tar -m [-Tjsvz] archive file ...\n");
365d192f3d3SKai Wang 	(void)fprintf(stderr, "\tar -m [-Tabijsvz] position archive file ...\n");
366d192f3d3SKai Wang 	(void)fprintf(stderr, "\tar -p [-Tv] archive [file ...]\n");
3670e479ac8STim Kientzle 	(void)fprintf(stderr, "\tar -q [-TcDjsvz] archive file ...\n");
3680e479ac8STim Kientzle 	(void)fprintf(stderr, "\tar -r [-TcDjsuvz] archive file ...\n");
3690e479ac8STim Kientzle 	(void)fprintf(stderr, "\tar -r [-TabcDijsuvz] position archive file ...\n");
370d192f3d3SKai Wang 	(void)fprintf(stderr, "\tar -s [-jz] archive\n");
371d192f3d3SKai Wang 	(void)fprintf(stderr, "\tar -t [-Tv] archive [file ...]\n");
372d192f3d3SKai Wang 	(void)fprintf(stderr, "\tar -x [-CTouv] archive [file ...]\n");
373d192f3d3SKai Wang 	(void)fprintf(stderr, "\tar -V\n");
374d192f3d3SKai Wang 	exit(EX_USAGE);
375d192f3d3SKai Wang }
376d192f3d3SKai Wang 
377d192f3d3SKai Wang static void
378ef636796SEd Schouten ranlib_usage(void)
379d192f3d3SKai Wang {
380d192f3d3SKai Wang 
381d192f3d3SKai Wang 	(void)fprintf(stderr, "usage:	ranlib [-t] archive ...\n");
382d192f3d3SKai Wang 	(void)fprintf(stderr, "\tranlib -V\n");
383d192f3d3SKai Wang 	exit(EX_USAGE);
384d192f3d3SKai Wang }
385d192f3d3SKai Wang 
386d192f3d3SKai Wang static void
387ef636796SEd Schouten bsdar_version(void)
388d192f3d3SKai Wang {
389d192f3d3SKai Wang 	(void)printf("BSD ar %s - %s\n", BSDAR_VERSION, archive_version());
390d192f3d3SKai Wang 	exit(EX_OK);
391d192f3d3SKai Wang }
392d192f3d3SKai Wang 
393d192f3d3SKai Wang static void
394ef636796SEd Schouten ranlib_version(void)
395d192f3d3SKai Wang {
396d192f3d3SKai Wang 	(void)printf("ranlib %s - %s\n", BSDAR_VERSION, archive_version());
397d192f3d3SKai Wang 	exit(EX_OK);
398d192f3d3SKai Wang }
399