1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright (c) 2017 Peter Tribble.
24 */
25
26 /*
27 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
28 * Use is subject to license terms.
29 */
30
31 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
32 /* All Rights Reserved */
33
34 /*
35 * Copyright 2010 Nexenta Systems, Inc. All rights reserved.
36 */
37
38 #include <locale.h>
39 #include <libintl.h>
40 #include <stdio.h>
41 #include <signal.h>
42 #include <stdlib.h>
43 #include <unistd.h>
44 #include <string.h>
45 #include <pkgtrans.h>
46 #include <pkglib.h>
47 #include <pkglocs.h>
48 #include <libadm.h>
49 #include <libinst.h>
50 #include <messages.h>
51
52 static int options;
53
54 static void usage(void);
55 static void trap(int signo);
56
57 int
main(int argc,char * argv[])58 main(int argc, char *argv[])
59 {
60 int c;
61 void (*func)();
62 extern int optind;
63 int ret;
64
65 (void) setlocale(LC_ALL, "");
66
67 #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
68 #define TEXT_DOMAIN "SYS_TEST"
69 #endif
70 (void) textdomain(TEXT_DOMAIN);
71
72 (void) set_prog_name(argv[0]);
73
74 while ((c = getopt(argc, argv, "snio?")) != EOF) {
75 switch (c) {
76 case 'n':
77 options |= PT_RENAME;
78 break;
79
80 case 'i':
81 options |= PT_INFO_ONLY;
82 break;
83
84 case 'o':
85 options |= PT_OVERWRITE;
86 break;
87
88 case 's':
89 options |= PT_ODTSTREAM;
90 break;
91
92 default:
93 usage();
94 return (1);
95 }
96 }
97 func = signal(SIGINT, trap);
98 if (func != SIG_DFL)
99 (void) signal(SIGINT, func);
100 (void) signal(SIGHUP, trap);
101 (void) signal(SIGQUIT, trap);
102 (void) signal(SIGTERM, trap);
103 (void) signal(SIGPIPE, trap);
104 (void) signal(SIGPWR, trap);
105
106 if ((argc-optind) < 2) {
107 usage();
108 return (1);
109 }
110
111 ret = pkgtrans(flex_device(argv[optind], 1),
112 flex_device(argv[optind+1], 1), &argv[optind+2], options);
113
114 quit(ret);
115 /*NOTREACHED*/
116 }
117
118 void
quit(int retcode)119 quit(int retcode)
120 {
121 (void) signal(SIGINT, SIG_IGN);
122 (void) signal(SIGHUP, SIG_IGN);
123 (void) ds_close(1);
124 (void) pkghead(NULL);
125 exit(retcode);
126 }
127
128 static void
trap(int signo)129 trap(int signo)
130 {
131 (void) signal(SIGINT, SIG_IGN);
132 (void) signal(SIGHUP, SIG_IGN);
133
134 if (signo == SIGINT) {
135 progerr(gettext("aborted at user request.\n"));
136 quit(3);
137 }
138 progerr(gettext("aborted by signal %d\n"), signo);
139 quit(1);
140 }
141
142 static void
usage(void)143 usage(void)
144 {
145 (void) fprintf(stderr,
146 gettext("usage: %s [-ions] srcdev dstdev [pkg [pkg...]]\n"),
147 get_prog_name());
148 }
149