xref: /titanic_52/usr/src/cmd/tsol/setlabel/setlabel.c (revision f875b4ebb1dd9fdbeb043557cab38ab3bf7f6e01)
1*f875b4ebSrica /*
2*f875b4ebSrica  * CDDL HEADER START
3*f875b4ebSrica  *
4*f875b4ebSrica  * The contents of this file are subject to the terms of the
5*f875b4ebSrica  * Common Development and Distribution License (the "License").
6*f875b4ebSrica  * You may not use this file except in compliance with the License.
7*f875b4ebSrica  *
8*f875b4ebSrica  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*f875b4ebSrica  * or http://www.opensolaris.org/os/licensing.
10*f875b4ebSrica  * See the License for the specific language governing permissions
11*f875b4ebSrica  * and limitations under the License.
12*f875b4ebSrica  *
13*f875b4ebSrica  * When distributing Covered Code, include this CDDL HEADER in each
14*f875b4ebSrica  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*f875b4ebSrica  * If applicable, add the following below this CDDL HEADER, with the
16*f875b4ebSrica  * fields enclosed by brackets "[]" replaced with your own identifying
17*f875b4ebSrica  * information: Portions Copyright [yyyy] [name of copyright owner]
18*f875b4ebSrica  *
19*f875b4ebSrica  * CDDL HEADER END
20*f875b4ebSrica  */
21*f875b4ebSrica 
22*f875b4ebSrica /*
23*f875b4ebSrica  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24*f875b4ebSrica  * Use is subject to license terms.
25*f875b4ebSrica  */
26*f875b4ebSrica 
27*f875b4ebSrica #pragma ident	"%Z%%M%	%I%	%E% SMI"
28*f875b4ebSrica 
29*f875b4ebSrica /*
30*f875b4ebSrica  *	setlabel - sets a file label.
31*f875b4ebSrica  */
32*f875b4ebSrica 
33*f875b4ebSrica #include <errno.h>
34*f875b4ebSrica #include <fcntl.h>
35*f875b4ebSrica #include <locale.h>
36*f875b4ebSrica #include <pwd.h>
37*f875b4ebSrica #include <stdio.h>
38*f875b4ebSrica #include <stdlib.h>
39*f875b4ebSrica #include <unistd.h>
40*f875b4ebSrica #include <string.h>
41*f875b4ebSrica #include <utmp.h>
42*f875b4ebSrica 
43*f875b4ebSrica #include <tsol/label.h>
44*f875b4ebSrica 
45*f875b4ebSrica static int	set_label(char *, char *);
46*f875b4ebSrica static int	setlabel(char *, bslabel_t *);
47*f875b4ebSrica static void	usage(void);
48*f875b4ebSrica static void	m_label_err(const char *, const int);
49*f875b4ebSrica 
50*f875b4ebSrica static char *prog = NULL;
51*f875b4ebSrica 
52*f875b4ebSrica int
53*f875b4ebSrica main(int argc, char **argv)
54*f875b4ebSrica {
55*f875b4ebSrica 	int	rc = 0;
56*f875b4ebSrica 	char	*label;
57*f875b4ebSrica 
58*f875b4ebSrica 	(void) setlocale(LC_ALL, "");
59*f875b4ebSrica #if !defined(TEXT_DOMAIN)	/* Should be defined by cc -D */
60*f875b4ebSrica #define	TEXT_DOMAIN	"SYS_TEST"	/* Use this only if it weren't */
61*f875b4ebSrica #endif
62*f875b4ebSrica 	(void) textdomain(TEXT_DOMAIN);
63*f875b4ebSrica 
64*f875b4ebSrica 	if ((prog = strrchr(argv[0], '/')) == NULL)
65*f875b4ebSrica 		prog = argv[0];
66*f875b4ebSrica 	else
67*f875b4ebSrica 		prog++;
68*f875b4ebSrica 
69*f875b4ebSrica 	if (argc < 3) {
70*f875b4ebSrica 		usage();
71*f875b4ebSrica 		return (2);
72*f875b4ebSrica 	}
73*f875b4ebSrica 
74*f875b4ebSrica 	argv++;
75*f875b4ebSrica 	argc--;
76*f875b4ebSrica 
77*f875b4ebSrica 	label = *argv;
78*f875b4ebSrica 	argv++;
79*f875b4ebSrica 	argc--;
80*f875b4ebSrica 	while (argc-- > 0) {
81*f875b4ebSrica 		if (set_label(*argv++, label) != 0)
82*f875b4ebSrica 			rc = 1;
83*f875b4ebSrica 	}
84*f875b4ebSrica 
85*f875b4ebSrica 	return (rc);
86*f875b4ebSrica }
87*f875b4ebSrica 
88*f875b4ebSrica static int
89*f875b4ebSrica set_label(char *filename, char *label)
90*f875b4ebSrica {
91*f875b4ebSrica 	int rval = 0;
92*f875b4ebSrica 	int err;
93*f875b4ebSrica 	m_label_t *blabel;
94*f875b4ebSrica 
95*f875b4ebSrica 	if ((blabel = m_label_alloc(MAC_LABEL)) == NULL) {
96*f875b4ebSrica 		(void) fprintf(stderr, "setlabel: ");
97*f875b4ebSrica 		perror(filename);
98*f875b4ebSrica 		return (2);
99*f875b4ebSrica 	}
100*f875b4ebSrica 	rval = getlabel(filename, blabel);
101*f875b4ebSrica 	if (rval) {
102*f875b4ebSrica 		(void) fprintf(stderr, "setlabel: ");
103*f875b4ebSrica 		perror(filename);
104*f875b4ebSrica 		return (rval);
105*f875b4ebSrica 	}
106*f875b4ebSrica 	if (!bslvalid(blabel)) {
107*f875b4ebSrica 		(void) fprintf(stderr,
108*f875b4ebSrica 		    gettext("%s: Current label is invalid\n"),
109*f875b4ebSrica 		    filename);
110*f875b4ebSrica 		blabel = NULL;
111*f875b4ebSrica 	}
112*f875b4ebSrica 	if (str_to_label(label, &blabel, MAC_LABEL, L_DEFAULT, &err) == -1) {
113*f875b4ebSrica 		m_label_err(label, err);
114*f875b4ebSrica 	}
115*f875b4ebSrica 
116*f875b4ebSrica 	rval = setlabel(filename, blabel);
117*f875b4ebSrica 	if (rval == 0)
118*f875b4ebSrica 		m_label_free(blabel);
119*f875b4ebSrica 	return (rval);
120*f875b4ebSrica }
121*f875b4ebSrica 
122*f875b4ebSrica static int
123*f875b4ebSrica setlabel(char *filename, bslabel_t *label)
124*f875b4ebSrica {
125*f875b4ebSrica 	int	rval;
126*f875b4ebSrica 
127*f875b4ebSrica 	rval = setflabel(filename, label);
128*f875b4ebSrica 
129*f875b4ebSrica 	if (rval) {
130*f875b4ebSrica 		(void) fprintf(stderr, "setlabel: ");
131*f875b4ebSrica 		perror(filename);
132*f875b4ebSrica 	}
133*f875b4ebSrica 	return (rval);
134*f875b4ebSrica }
135*f875b4ebSrica 
136*f875b4ebSrica static void
137*f875b4ebSrica m_label_err(const char *ascii, const int err)
138*f875b4ebSrica {
139*f875b4ebSrica 	if (errno == EINVAL) {
140*f875b4ebSrica 		switch (err) {
141*f875b4ebSrica 		case M_BAD_STRING:
142*f875b4ebSrica 			(void) fprintf(stderr,
143*f875b4ebSrica 			    gettext("setlabel: bad string %s\n"), ascii);
144*f875b4ebSrica 		break;
145*f875b4ebSrica 		case M_BAD_LABEL:
146*f875b4ebSrica 			(void) fprintf(stderr,
147*f875b4ebSrica 			    gettext("setlabel: bad previous label\n"));
148*f875b4ebSrica 		break;
149*f875b4ebSrica 		default:
150*f875b4ebSrica 			(void) fprintf(stderr,
151*f875b4ebSrica 			    gettext("setlabel: parsing error found in "
152*f875b4ebSrica 			    "\"%s\" at position %d\n"), ascii, err);
153*f875b4ebSrica 		break;
154*f875b4ebSrica 		}
155*f875b4ebSrica 	} else {
156*f875b4ebSrica 		perror("setlabel");
157*f875b4ebSrica 	}
158*f875b4ebSrica 	exit(1);
159*f875b4ebSrica }
160*f875b4ebSrica /*
161*f875b4ebSrica  * usage()
162*f875b4ebSrica  *
163*f875b4ebSrica  * This routine is called whenever there is a usage type of error has
164*f875b4ebSrica  * occured.  For example, when a invalid option has has been specified.
165*f875b4ebSrica  *
166*f875b4ebSrica  */
167*f875b4ebSrica static void
168*f875b4ebSrica usage(void)
169*f875b4ebSrica {
170*f875b4ebSrica 
171*f875b4ebSrica 	(void) fprintf(stderr, gettext("Usage: \n"));
172*f875b4ebSrica 	(void) fprintf(stderr, gettext(
173*f875b4ebSrica 	    "	%s newlabel filename [...] \n"), prog);
174*f875b4ebSrica 
175*f875b4ebSrica }
176