xref: /illumos-gate/usr/src/tools/install.bin/install.bin.c (revision 88f8b78a88cbdc6d8c1af5c3e54bc49d25095c98)
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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <strings.h>
33 #include <sys/param.h>
34 #include <fcntl.h>
35 #include <sys/errno.h>
36 #include <sys/types.h>
37 #include <sys/uio.h>
38 #include <unistd.h>
39 #include <sys/stat.h>
40 #include <errno.h>
41 #include <libgen.h>
42 
43 
44 #define	FILE_BUFF	40960
45 
46 int supress = 0;
47 
48 
49 void
50 usage(void)
51 {
52 	(void) fprintf(stderr,
53 	    "usage: install [-sd][-m mode][-g group][-u owner] "
54 	    "-f dir file ...\n");
55 }
56 
57 void
58 file_copy(char *src_file, char *dest_file)
59 {
60 	int	src_fd;
61 	int	dest_fd;
62 	int	count;
63 	static char file_buff[FILE_BUFF];
64 
65 	if ((src_fd = open(src_file, O_RDONLY))  == -1) {
66 		perror(src_file);
67 		exit(1);
68 	}
69 
70 	if ((dest_fd = open(dest_file, O_CREAT|O_WRONLY|O_TRUNC, 0755)) == -1) {
71 		perror(dest_file);
72 		exit(1);
73 	}
74 
75 	while ((count = read(src_fd, file_buff, FILE_BUFF)) > 0) {
76 		write(dest_fd, file_buff, count);
77 	}
78 
79 	if (count == -1) {
80 		perror("file_copy(read)");
81 		exit(1);
82 	}
83 
84 	if (!supress)
85 		(void) printf("%s installed as %s\n", src_file, dest_file);
86 
87 	close(src_fd);
88 	close(dest_fd);
89 }
90 
91 
92 void
93 chown_file(const char *file, const char *group, const char *owner)
94 {
95 	gid_t	grp;
96 	gid_t	own;
97 
98 	if (group) {
99 		if (strcmp(group, "bin") == 0)
100 			grp = 2;
101 		else if (strcmp(group, "sys") == 0)
102 			grp = 3;
103 		else if (strcmp(group, "adm") == 0)
104 			grp = 4;
105 		else if (strcmp(group, "uucp") == 0)
106 			grp = 5;
107 		else if (strcmp(group, "mail") == 0)
108 			grp = 6;
109 		else if (strcmp(group, "tty") == 0)
110 			grp = 7;
111 		else if (strcmp(group, "lp") == 0)
112 			grp = 8;
113 		else if (strcmp(group, "other") == 0)
114 			grp = 1;
115 		else if (strcmp(group, "nuucp") == 0)
116 			grp = 9;
117 		else if (strcmp(group, "staff") == 0)
118 			grp = 10;
119 		else if (strcmp(group, "daemon") == 0)
120 			grp = 12;
121 		else if (strcmp(group, "root") == 0)
122 			grp = 0;
123 		else if (strcmp(group, "sysadmin") == 0)
124 			grp = 14;
125 		else if (strcmp(group, "smmsp") == 0)
126 			grp = 25;
127 		else if (strcmp(group, "nobody") == 0)
128 			grp = 60001;
129 		else if (strcmp(group, "noaccess") == 0)
130 			grp = 60002;
131 		else if (strcmp(group, "svvs_grp") == 0)
132 			grp = 101;
133 		else
134 			(void) fprintf(stderr, "unknown group(%s)\n", group);
135 	} else {
136 		grp = -1;
137 	}
138 
139 	if (owner) {
140 		if (strcmp(owner, "bin") == 0)
141 			own = 2;
142 		else if (strcmp(owner, "daemon") == 0)
143 			own = 1;
144 		else if (strcmp(owner, "sys") == 0)
145 			own = 3;
146 		else if (strcmp(owner, "adm") == 0)
147 			own = 4;
148 		else if (strcmp(owner, "lp") == 0)
149 			own = 71;
150 		else if (strcmp(owner, "root") == 0)
151 			own = 0;
152 		else if (strcmp(owner, "uucp") == 0)
153 			own = 5;
154 		else if (strcmp(owner, "nuucp") == 0)
155 			own = 9;
156 		else if (strcmp(owner, "smmsp") == 0)
157 			own = 25;
158 		else if (strcmp(owner, "listen") == 0)
159 			own = 37;
160 		else if (strcmp(owner, "nobody") == 0)
161 			own = 60001;
162 		else if (strcmp(owner, "noaccess") == 0)
163 			own = 60002;
164 		/*
165 		 * This is a temporary HACK that should be removed!!!
166 		 */
167 		else if (strcmp(owner, "sysadm") == 0)
168 			own = 0;
169 		else {
170 			(void) fprintf(stderr, "unknown owner(%s)\n", owner);
171 			exit(1);
172 		}
173 
174 	} else {
175 		own = -1;
176 	}
177 
178 	if (chown(file, own, grp) == -1) {
179 		perror("chown");
180 		exit(1);
181 	}
182 }
183 
184 char *
185 find_basename(const char *str)
186 {
187 	int	i;
188 	int	len;
189 
190 	len = strlen(str);
191 
192 	for (i = len-1; i >= 0; i--)
193 		if (str[i] == '/')
194 			return ((char *)(str + i + 1));
195 	return ((char *)str);
196 }
197 
198 
199 int
200 main(int argc, char **argv)
201 {
202 	int	c;
203 	int	errflg = 0;
204 	int	dirflg = 0;
205 	char	*group = NULL;
206 	char	*owner = NULL;
207 	char	*dirb = NULL;
208 	char	*ins_file = NULL;
209 	int	mode = -1;
210 	char	dest_file[MAXPATHLEN];
211 
212 
213 	while ((c = getopt(argc, argv, "f:sm:du:g:")) != EOF) {
214 		switch (c) {
215 		case 'f':
216 			dirb = optarg;
217 			break;
218 		case 'g':
219 			group = optarg;
220 			break;
221 		case 'u':
222 			owner = optarg;
223 			break;
224 		case 'd':
225 			dirflg = 1;
226 			break;
227 		case 'm':
228 			mode = strtol(optarg, NULL, 8);
229 			break;
230 		case 's':
231 			supress = 1;
232 			break;
233 		case '?':
234 			errflg++;
235 			break;
236 		}
237 	}
238 
239 	if (errflg) {
240 		usage();
241 		return (1);
242 	}
243 
244 	if (argc == optind) {
245 		usage();
246 		return (1);
247 	}
248 
249 	if (!dirflg && (dirb == NULL)) {
250 		(void) fprintf(stderr,
251 		    "install: no destination directory specified.\n");
252 		return (1);
253 	}
254 
255 
256 	for (c = optind; c < argc; c++) {
257 		ins_file = argv[c];
258 
259 		if (dirflg) {
260 			struct stat buf;
261 
262 			if (stat(ins_file, &buf) == 0) {
263 				if ((buf.st_mode & S_IFMT) == S_IFDIR)
264 					continue;
265 			} else {
266 				if (errno != ENOENT) {
267 					perror("install: stat");
268 					return (1);
269 				}
270 			}
271 
272 			(void) strcpy(dest_file, ins_file);
273 
274 			if (mkdirp(dest_file, 0755) == -1) {
275 				if (!supress) {
276 					(void) printf(
277 					    "install: mkdirp of %s failed\n",
278 					    dest_file);
279 				}
280 			} else if (!supress) {
281 				(void) printf("directory %s created\n",
282 				    dest_file);
283 			}
284 		} else {
285 			(void) strcat(strcat(strcpy(dest_file, dirb), "/"),
286 			    find_basename(ins_file));
287 			file_copy(ins_file, dest_file);
288 		}
289 
290 		if (group || owner)
291 			chown_file(dest_file, group, owner);
292 
293 		if (mode != -1) {
294 			umask(0);
295 			if (chmod(dest_file, mode) == -1) {
296 				perror("chmod");
297 				return (1);
298 			}
299 		}
300 	}
301 	return (0);
302 }
303