xref: /titanic_51/usr/src/cmd/sgs/ar/common/main.c (revision ba7866cd2cbdf574f47d4e38a1301b90744dd677)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5d2d5cf7cSAli Bahrami  * Common Development and Distribution License (the "License").
6d2d5cf7cSAli Bahrami  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
217c478bd9Sstevel@tonic-gate /*	Copyright (c) 1988 AT&T	*/
227c478bd9Sstevel@tonic-gate /*	  All Rights Reserved  	*/
237c478bd9Sstevel@tonic-gate 
247c478bd9Sstevel@tonic-gate /*
25*ba7866cdSAli Bahrami  * Copyright (c) 1995, 2010, Oracle and/or its affiliates. All rights reserved.
267c478bd9Sstevel@tonic-gate  */
277c478bd9Sstevel@tonic-gate 
287c478bd9Sstevel@tonic-gate #include "inc.h"
29*ba7866cdSAli Bahrami #include "conv.h"
307c478bd9Sstevel@tonic-gate 
317c478bd9Sstevel@tonic-gate /*
32*ba7866cdSAli Bahrami  * Forward declarations
337c478bd9Sstevel@tonic-gate  */
347c478bd9Sstevel@tonic-gate static void setup(int, char **, Cmd_info *);
35*ba7866cdSAli Bahrami static void setcom(Cmd_info *, Cmd_func);
36d6555420Smike_s static void usage(void);
37d6555420Smike_s static void sigexit(int sig);
387c478bd9Sstevel@tonic-gate static int notfound(Cmd_info *);
397c478bd9Sstevel@tonic-gate static void check_swap();
407c478bd9Sstevel@tonic-gate 
41*ba7866cdSAli Bahrami const char *
42*ba7866cdSAli Bahrami _ar_msg(Msg mid)
43*ba7866cdSAli Bahrami {
44*ba7866cdSAli Bahrami 	return (gettext(MSG_ORIG(mid)));
45*ba7866cdSAli Bahrami }
46*ba7866cdSAli Bahrami 
47*ba7866cdSAli Bahrami 
48*ba7866cdSAli Bahrami void
49*ba7866cdSAli Bahrami establish_sighandler(void (*handler)())
50*ba7866cdSAli Bahrami {
51*ba7866cdSAli Bahrami 	static const int signum[] = {SIGHUP, SIGINT, SIGQUIT, 0};
52*ba7866cdSAli Bahrami 	int i;
53*ba7866cdSAli Bahrami 
54*ba7866cdSAli Bahrami 	if (handler == SIG_IGN) {
55*ba7866cdSAli Bahrami 		/* Ignore all the specified signals */
56*ba7866cdSAli Bahrami 		for (i = 0; signum[i]; i++)
57*ba7866cdSAli Bahrami 			(void) signal(signum[i], SIG_IGN);
58*ba7866cdSAli Bahrami 
59*ba7866cdSAli Bahrami 	} else {
60*ba7866cdSAli Bahrami 		/*
61*ba7866cdSAli Bahrami 		 * Set any signal that doesn't default to being ignored
62*ba7866cdSAli Bahrami 		 * to our signal handler.
63*ba7866cdSAli Bahrami 		 */
64*ba7866cdSAli Bahrami 		for (i = 0; signum[i]; i++)
65*ba7866cdSAli Bahrami 			if (signal(signum[i], SIG_IGN) != SIG_IGN)
66*ba7866cdSAli Bahrami 				(void) signal(signum[i], handler);
67*ba7866cdSAli Bahrami 	}
68*ba7866cdSAli Bahrami }
697c478bd9Sstevel@tonic-gate 
707c478bd9Sstevel@tonic-gate int
71*ba7866cdSAli Bahrami main(int argc, char **argv, char *envp[])
727c478bd9Sstevel@tonic-gate {
737c478bd9Sstevel@tonic-gate 	int fd;
747c478bd9Sstevel@tonic-gate 	Cmd_info *cmd_info;
757c478bd9Sstevel@tonic-gate 	int ret;
767c478bd9Sstevel@tonic-gate 	char *new = NULL;
777c478bd9Sstevel@tonic-gate 
78*ba7866cdSAli Bahrami #ifndef	XPG4
79*ba7866cdSAli Bahrami 	/*
80*ba7866cdSAli Bahrami 	 * Check for a binary that better fits this architecture.
81*ba7866cdSAli Bahrami 	 */
82*ba7866cdSAli Bahrami 	(void) conv_check_native(argv, envp);
837c478bd9Sstevel@tonic-gate #endif
847c478bd9Sstevel@tonic-gate 
85*ba7866cdSAli Bahrami 	/*
86*ba7866cdSAli Bahrami 	 * Establish locale.
87*ba7866cdSAli Bahrami 	 */
88*ba7866cdSAli Bahrami 	(void) setlocale(LC_ALL, MSG_ORIG(MSG_STR_EMPTY));
89*ba7866cdSAli Bahrami 	(void) textdomain(MSG_ORIG(MSG_SUNW_OST_SGS));
90*ba7866cdSAli Bahrami 
91*ba7866cdSAli Bahrami 	/* Allow a graceful exit up until we start to write an archive */
92*ba7866cdSAli Bahrami 	establish_sighandler(sigexit);
93*ba7866cdSAli Bahrami 
947c478bd9Sstevel@tonic-gate 	/*
957c478bd9Sstevel@tonic-gate 	 * Initialize cmd_info
967c478bd9Sstevel@tonic-gate 	 */
977c478bd9Sstevel@tonic-gate 	cmd_info = (Cmd_info *)calloc(1, sizeof (Cmd_info));
987c478bd9Sstevel@tonic-gate 	if (cmd_info == NULL) {
99*ba7866cdSAli Bahrami 		int err = errno;
100*ba7866cdSAli Bahrami 		(void) fprintf(stderr, MSG_INTL(MSG_MALLOC), strerror(err));
1017c478bd9Sstevel@tonic-gate 		exit(1);
1027c478bd9Sstevel@tonic-gate 	}
1037c478bd9Sstevel@tonic-gate 
1047c478bd9Sstevel@tonic-gate 	if (argc < 2)
1057c478bd9Sstevel@tonic-gate 		usage();
1067c478bd9Sstevel@tonic-gate 
1077c478bd9Sstevel@tonic-gate 	/*
1087c478bd9Sstevel@tonic-gate 	 * Option handling.
1097c478bd9Sstevel@tonic-gate 	 */
1107c478bd9Sstevel@tonic-gate 	if (argv[1][0] != '-') {
1117c478bd9Sstevel@tonic-gate 		new = (char *)malloc(strlen(argv[1]) + 2);
1127c478bd9Sstevel@tonic-gate 		if (new == NULL) {
113*ba7866cdSAli Bahrami 			int err = errno;
114*ba7866cdSAli Bahrami 			(void) fprintf(stderr, MSG_INTL(MSG_MALLOC),
115*ba7866cdSAli Bahrami 			    strerror(err));
1167c478bd9Sstevel@tonic-gate 			exit(1);
1177c478bd9Sstevel@tonic-gate 		}
118*ba7866cdSAli Bahrami 		(void) strcpy(new, MSG_ORIG(MSG_STR_HYPHEN));
1197c478bd9Sstevel@tonic-gate 		(void) strcat(new, argv[1]);
1207c478bd9Sstevel@tonic-gate 		argv[1] = new;
1217c478bd9Sstevel@tonic-gate 	}
1227c478bd9Sstevel@tonic-gate 	setup(argc, argv, cmd_info);
1237c478bd9Sstevel@tonic-gate 
1247c478bd9Sstevel@tonic-gate 	/*
1257c478bd9Sstevel@tonic-gate 	 * Check SWAP
1267c478bd9Sstevel@tonic-gate 	 */
127*ba7866cdSAli Bahrami 	if (cmd_info->opt_flgs & z_FLAG)
1287c478bd9Sstevel@tonic-gate 		check_swap();
1297c478bd9Sstevel@tonic-gate 
130*ba7866cdSAli Bahrami 	if (cmd_info->comfun == NULL) {
131*ba7866cdSAli Bahrami 		if ((cmd_info->opt_flgs & (d_FLAG | r_FLAG | q_FLAG |
132*ba7866cdSAli Bahrami 		    t_FLAG | p_FLAG | m_FLAG | x_FLAG)) == 0) {
133*ba7866cdSAli Bahrami 			(void) fprintf(stderr, MSG_INTL(MSG_USAGE_01));
1347c478bd9Sstevel@tonic-gate 			exit(1);
1357c478bd9Sstevel@tonic-gate 		}
1367c478bd9Sstevel@tonic-gate 	}
1377c478bd9Sstevel@tonic-gate 
138*ba7866cdSAli Bahrami 	cmd_info->modified = (cmd_info->opt_flgs & s_FLAG);
1397c478bd9Sstevel@tonic-gate 	fd = getaf(cmd_info);
1407c478bd9Sstevel@tonic-gate 
1417c478bd9Sstevel@tonic-gate 	if ((fd == -1) &&
142*ba7866cdSAli Bahrami 	    (cmd_info->opt_flgs &
143*ba7866cdSAli Bahrami 	    (d_FLAG | m_FLAG | p_FLAG | t_FLAG | x_FLAG)) ||
144*ba7866cdSAli Bahrami 	    ((cmd_info->opt_flgs & r_FLAG) &&
145*ba7866cdSAli Bahrami 	    (cmd_info->opt_flgs & (a_FLAG | b_FLAG)))) {
146*ba7866cdSAli Bahrami 		(void) fprintf(stderr, MSG_INTL(MSG_NOT_FOUND_AR),
147*ba7866cdSAli Bahrami 		    cmd_info->arnam);
1487c478bd9Sstevel@tonic-gate 		exit(1);
1497c478bd9Sstevel@tonic-gate 	}
1507c478bd9Sstevel@tonic-gate 
1517c478bd9Sstevel@tonic-gate 	(*cmd_info->comfun)(cmd_info);
1527c478bd9Sstevel@tonic-gate 	if (cmd_info->modified) {
153*ba7866cdSAli Bahrami 		writefile(cmd_info);
1547c478bd9Sstevel@tonic-gate 	} else
1557c478bd9Sstevel@tonic-gate 		(void) close(fd);
1567c478bd9Sstevel@tonic-gate 
1577c478bd9Sstevel@tonic-gate 	ret = notfound(cmd_info);
1587c478bd9Sstevel@tonic-gate 
1597c478bd9Sstevel@tonic-gate 	/*
1607c478bd9Sstevel@tonic-gate 	 * Check SWAP
1617c478bd9Sstevel@tonic-gate 	 */
162*ba7866cdSAli Bahrami 	if (cmd_info->opt_flgs & z_FLAG)
1637c478bd9Sstevel@tonic-gate 		check_swap();
1647c478bd9Sstevel@tonic-gate 
1657c478bd9Sstevel@tonic-gate 	free(new);
1667c478bd9Sstevel@tonic-gate 	free(cmd_info);
1677c478bd9Sstevel@tonic-gate 	return (ret);
1687c478bd9Sstevel@tonic-gate 
1697c478bd9Sstevel@tonic-gate }
1707c478bd9Sstevel@tonic-gate 
1717c478bd9Sstevel@tonic-gate /*
172*ba7866cdSAli Bahrami  * Option handing function.
1737c478bd9Sstevel@tonic-gate  *	Using getopt(), following xcu4 convention.
1747c478bd9Sstevel@tonic-gate  */
1757c478bd9Sstevel@tonic-gate static void
1767c478bd9Sstevel@tonic-gate setup(int argc, char *argv[], Cmd_info *cmd_info)
1777c478bd9Sstevel@tonic-gate {
1787c478bd9Sstevel@tonic-gate 	int Vflag = 0;
1797c478bd9Sstevel@tonic-gate 	int c;
1807c478bd9Sstevel@tonic-gate 	int usage_err = 0;
1817c478bd9Sstevel@tonic-gate 
182*ba7866cdSAli Bahrami 	while ((c = getopt(argc, argv, MSG_ORIG(MSG_STR_OPTIONS))) != -1) {
1837c478bd9Sstevel@tonic-gate 		switch (c) {
1847c478bd9Sstevel@tonic-gate 		case 'a': /* position after named archive member file */
1857c478bd9Sstevel@tonic-gate 			cmd_info->opt_flgs |= a_FLAG;
1867c478bd9Sstevel@tonic-gate 			cmd_info->ponam = trim(optarg);
1877c478bd9Sstevel@tonic-gate 			break;
1887c478bd9Sstevel@tonic-gate 		case 'b': /* position before named archive member file */
1897c478bd9Sstevel@tonic-gate 		case 'i': /* position before named archive member: same as b */
1907c478bd9Sstevel@tonic-gate 			cmd_info->opt_flgs |= b_FLAG;
1917c478bd9Sstevel@tonic-gate 			cmd_info->ponam = trim(optarg);
1927c478bd9Sstevel@tonic-gate 			break;
1937c478bd9Sstevel@tonic-gate 		case 'c': /* supress messages */
1947c478bd9Sstevel@tonic-gate 			cmd_info->opt_flgs |= c_FLAG;
1957c478bd9Sstevel@tonic-gate 			break;
1967c478bd9Sstevel@tonic-gate 		case 'd':
1977c478bd9Sstevel@tonic-gate 			/*
1987c478bd9Sstevel@tonic-gate 			 * key operation:
1997c478bd9Sstevel@tonic-gate 			 * delete files from the archive
2007c478bd9Sstevel@tonic-gate 			 */
2017c478bd9Sstevel@tonic-gate 			setcom(cmd_info, dcmd);
2027c478bd9Sstevel@tonic-gate 			cmd_info->opt_flgs |= d_FLAG;
2037c478bd9Sstevel@tonic-gate 			break;
204*ba7866cdSAli Bahrami 		case 'l': /* ignored */
2057c478bd9Sstevel@tonic-gate 			break;
2067c478bd9Sstevel@tonic-gate 		case 'm':
2077c478bd9Sstevel@tonic-gate 			/*
2087c478bd9Sstevel@tonic-gate 			 * key operation:
2097c478bd9Sstevel@tonic-gate 			 * move files to end of the archive
2107c478bd9Sstevel@tonic-gate 			 * or as indicated by position flag
2117c478bd9Sstevel@tonic-gate 			 */
2127c478bd9Sstevel@tonic-gate 			setcom(cmd_info, mcmd);
2137c478bd9Sstevel@tonic-gate 			cmd_info->opt_flgs |= m_FLAG;
2147c478bd9Sstevel@tonic-gate 			break;
2157c478bd9Sstevel@tonic-gate 		case 'p':
2167c478bd9Sstevel@tonic-gate 			/*
2177c478bd9Sstevel@tonic-gate 			 * key operation:
2187c478bd9Sstevel@tonic-gate 			 * print files in the archive
2197c478bd9Sstevel@tonic-gate 			 */
2207c478bd9Sstevel@tonic-gate 			setcom(cmd_info, pcmd);
2217c478bd9Sstevel@tonic-gate 			cmd_info->opt_flgs |= p_FLAG;
2227c478bd9Sstevel@tonic-gate 			break;
2237c478bd9Sstevel@tonic-gate 		case 'q':
2247c478bd9Sstevel@tonic-gate 			/*
2257c478bd9Sstevel@tonic-gate 			 * key operation:
2267c478bd9Sstevel@tonic-gate 			 * quickly append files to end of the archive
2277c478bd9Sstevel@tonic-gate 			 */
2287c478bd9Sstevel@tonic-gate 			setcom(cmd_info, qcmd);
2297c478bd9Sstevel@tonic-gate 			cmd_info->opt_flgs |= q_FLAG;
2307c478bd9Sstevel@tonic-gate 			break;
2317c478bd9Sstevel@tonic-gate 		case 'r':
2327c478bd9Sstevel@tonic-gate 			/*
2337c478bd9Sstevel@tonic-gate 			 * key operation:
2347c478bd9Sstevel@tonic-gate 			 * replace or add files to the archive
2357c478bd9Sstevel@tonic-gate 			 */
2367c478bd9Sstevel@tonic-gate 			setcom(cmd_info, rcmd);
2377c478bd9Sstevel@tonic-gate 			cmd_info->opt_flgs |= r_FLAG;
2387c478bd9Sstevel@tonic-gate 			break;
2397c478bd9Sstevel@tonic-gate 		case 's': /* force symbol table regeneration */
2407c478bd9Sstevel@tonic-gate 			cmd_info->opt_flgs |= s_FLAG;
2417c478bd9Sstevel@tonic-gate 			break;
242*ba7866cdSAli Bahrami 		case 'S': /* Build SYM64 symbol table */
243*ba7866cdSAli Bahrami 			cmd_info->opt_flgs |= S_FLAG;
244*ba7866cdSAli Bahrami 			break;
2457c478bd9Sstevel@tonic-gate 		case 't':
2467c478bd9Sstevel@tonic-gate 			/*
2477c478bd9Sstevel@tonic-gate 			 * key operation:
2487c478bd9Sstevel@tonic-gate 			 * print table of contents
2497c478bd9Sstevel@tonic-gate 			 */
2507c478bd9Sstevel@tonic-gate 			setcom(cmd_info, tcmd);
2517c478bd9Sstevel@tonic-gate 			cmd_info->opt_flgs |= t_FLAG;
2527c478bd9Sstevel@tonic-gate 			break;
2537c478bd9Sstevel@tonic-gate 		case 'u': /* update: change archive dependent on file dates */
2547c478bd9Sstevel@tonic-gate 			cmd_info->opt_flgs |= u_FLAG;
2557c478bd9Sstevel@tonic-gate 			break;
2567c478bd9Sstevel@tonic-gate 		case 'v': /* verbose */
2577c478bd9Sstevel@tonic-gate 			cmd_info->opt_flgs |= v_FLAG;
2587c478bd9Sstevel@tonic-gate 			break;
2597c478bd9Sstevel@tonic-gate 		case 'x':
2607c478bd9Sstevel@tonic-gate 			/*
2617c478bd9Sstevel@tonic-gate 			 * key operation:
2627c478bd9Sstevel@tonic-gate 			 * extract files from the archive
2637c478bd9Sstevel@tonic-gate 			 */
2647c478bd9Sstevel@tonic-gate 			setcom(cmd_info, xcmd);
2657c478bd9Sstevel@tonic-gate 			cmd_info->opt_flgs |= x_FLAG;
2667c478bd9Sstevel@tonic-gate 			break;
2677c478bd9Sstevel@tonic-gate 		case 'z':
2687c478bd9Sstevel@tonic-gate 			cmd_info->opt_flgs |= z_FLAG;
2697c478bd9Sstevel@tonic-gate 			break;
2707c478bd9Sstevel@tonic-gate 		case 'V':
2717c478bd9Sstevel@tonic-gate 			/*
2727c478bd9Sstevel@tonic-gate 			 * print version information.
2737c478bd9Sstevel@tonic-gate 			 * adjust command line access accounting
2747c478bd9Sstevel@tonic-gate 			 */
2757c478bd9Sstevel@tonic-gate 			if (Vflag == 0) {
276*ba7866cdSAli Bahrami 				(void) fprintf(stderr,
277*ba7866cdSAli Bahrami 				    MSG_ORIG(MSG_FMT_VERSION),
2787c478bd9Sstevel@tonic-gate 				    (const char *)SGU_PKG,
2797c478bd9Sstevel@tonic-gate 				    (const char *)SGU_REL);
2807c478bd9Sstevel@tonic-gate 					Vflag++;
2817c478bd9Sstevel@tonic-gate 			}
2827c478bd9Sstevel@tonic-gate 			break;
2837c478bd9Sstevel@tonic-gate 		case 'C':
284*ba7866cdSAli Bahrami 			cmd_info->opt_flgs |= C_FLAG;
2857c478bd9Sstevel@tonic-gate 			break;
2867c478bd9Sstevel@tonic-gate 		case 'M':
287*ba7866cdSAli Bahrami 			/*
288*ba7866cdSAli Bahrami 			 * -M was an original undocumented AT&T feature that
289*ba7866cdSAli Bahrami 			 * would force the use of mmap() instead of read()
290*ba7866cdSAli Bahrami 			 * for pulling file data into the process before
291*ba7866cdSAli Bahrami 			 * writing it to the archive. Ignored.
292*ba7866cdSAli Bahrami 			 */
2937c478bd9Sstevel@tonic-gate 			break;
2947c478bd9Sstevel@tonic-gate 		case 'T':
295*ba7866cdSAli Bahrami 			cmd_info->opt_flgs |= T_FLAG;
2967c478bd9Sstevel@tonic-gate 			break;
2977c478bd9Sstevel@tonic-gate 		case ':':
298*ba7866cdSAli Bahrami 			(void) fprintf(stderr, MSG_INTL(MSG_USAGE_02), optopt);
2997c478bd9Sstevel@tonic-gate 			usage_err++;
3007c478bd9Sstevel@tonic-gate 			break;
3017c478bd9Sstevel@tonic-gate 		case '?':
302*ba7866cdSAli Bahrami 			(void) fprintf(stderr, MSG_INTL(MSG_USAGE_03), optopt);
3037c478bd9Sstevel@tonic-gate 			usage_err++;
3047c478bd9Sstevel@tonic-gate 			break;
3057c478bd9Sstevel@tonic-gate 		}
3067c478bd9Sstevel@tonic-gate 	}
3077c478bd9Sstevel@tonic-gate 
3087c478bd9Sstevel@tonic-gate 	if (usage_err || argc - optind < 1)
3097c478bd9Sstevel@tonic-gate 		usage();
3107c478bd9Sstevel@tonic-gate 
311*ba7866cdSAli Bahrami 	cmd_info->arnam = argv[optind];
3127c478bd9Sstevel@tonic-gate 	cmd_info->namv = &argv[optind+1];
3137c478bd9Sstevel@tonic-gate 	cmd_info->namc = argc - optind - 1;
3147c478bd9Sstevel@tonic-gate }
3157c478bd9Sstevel@tonic-gate 
3167c478bd9Sstevel@tonic-gate 
3177c478bd9Sstevel@tonic-gate /*
3187c478bd9Sstevel@tonic-gate  * Set the function to be called to do the key operation.
3197c478bd9Sstevel@tonic-gate  * Check that only one key is indicated.
3207c478bd9Sstevel@tonic-gate  */
3217c478bd9Sstevel@tonic-gate static void
322*ba7866cdSAli Bahrami setcom(Cmd_info *cmd_info, Cmd_func *fun)
3237c478bd9Sstevel@tonic-gate {
3247c478bd9Sstevel@tonic-gate 	if (cmd_info->comfun != 0) {
325*ba7866cdSAli Bahrami 		(void) fprintf(stderr, MSG_INTL(MSG_USAGE_04));
3267c478bd9Sstevel@tonic-gate 		exit(1);
3277c478bd9Sstevel@tonic-gate 	}
3287c478bd9Sstevel@tonic-gate 	cmd_info->comfun = fun;
3297c478bd9Sstevel@tonic-gate }
3307c478bd9Sstevel@tonic-gate 
3317c478bd9Sstevel@tonic-gate static void
332d6555420Smike_s usage(void)
3337c478bd9Sstevel@tonic-gate {
334*ba7866cdSAli Bahrami 	(void) fprintf(stderr, MSG_INTL(MSG_USAGE));
3357c478bd9Sstevel@tonic-gate 	exit(1);
3367c478bd9Sstevel@tonic-gate }
3377c478bd9Sstevel@tonic-gate 
3387c478bd9Sstevel@tonic-gate /*ARGSUSED0*/
3397c478bd9Sstevel@tonic-gate static void
340d6555420Smike_s sigexit(int sig)
3417c478bd9Sstevel@tonic-gate {
3427c478bd9Sstevel@tonic-gate 	exit(100);
3437c478bd9Sstevel@tonic-gate }
3447c478bd9Sstevel@tonic-gate 
3457c478bd9Sstevel@tonic-gate /* tells the user which of the listed files were not found in the archive */
3467c478bd9Sstevel@tonic-gate 
3477c478bd9Sstevel@tonic-gate static int
3487c478bd9Sstevel@tonic-gate notfound(Cmd_info *cmd_info)
3497c478bd9Sstevel@tonic-gate {
350d6555420Smike_s 	int i, n;
3517c478bd9Sstevel@tonic-gate 
3527c478bd9Sstevel@tonic-gate 	n = 0;
3537c478bd9Sstevel@tonic-gate 	for (i = 0; i < cmd_info->namc; i++)
3547c478bd9Sstevel@tonic-gate 		if (cmd_info->namv[i]) {
355*ba7866cdSAli Bahrami 			(void) fprintf(stderr, MSG_INTL(MSG_NOT_FOUND_FILE),
356*ba7866cdSAli Bahrami 			    cmd_info->namv[i]);
3577c478bd9Sstevel@tonic-gate 			n++;
3587c478bd9Sstevel@tonic-gate 		}
3597c478bd9Sstevel@tonic-gate 	return (n);
3607c478bd9Sstevel@tonic-gate }
3617c478bd9Sstevel@tonic-gate 
3627c478bd9Sstevel@tonic-gate /*
3637c478bd9Sstevel@tonic-gate  * Debugging info
3647c478bd9Sstevel@tonic-gate  */
3657c478bd9Sstevel@tonic-gate static void
366d6555420Smike_s check_swap(void)
3677c478bd9Sstevel@tonic-gate {
368*ba7866cdSAli Bahrami 	(void) system(MSG_ORIG(MSG_CMD_SWAP));
3697c478bd9Sstevel@tonic-gate }
370