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 /*
28*f875b4ebSrica  *	setlabel - sets a file label.
29*f875b4ebSrica  */
30*f875b4ebSrica 
31*f875b4ebSrica #include <errno.h>
32*f875b4ebSrica #include <fcntl.h>
33*f875b4ebSrica #include <locale.h>
34*f875b4ebSrica #include <pwd.h>
35*f875b4ebSrica #include <stdio.h>
36*f875b4ebSrica #include <stdlib.h>
37*f875b4ebSrica #include <unistd.h>
38*f875b4ebSrica #include <string.h>
39*f875b4ebSrica #include <utmp.h>
40*f875b4ebSrica 
41*f875b4ebSrica #include <tsol/label.h>
42*f875b4ebSrica 
43*f875b4ebSrica static int	set_label(char *, char *);
44*f875b4ebSrica static int	setlabel(char *, bslabel_t *);
45*f875b4ebSrica static void	usage(void);
46*f875b4ebSrica static void	m_label_err(const char *, const int);
47*f875b4ebSrica 
48*f875b4ebSrica static char *prog = NULL;
49*f875b4ebSrica 
50*f875b4ebSrica int
main(int argc,char ** argv)51*f875b4ebSrica main(int argc, char **argv)
52*f875b4ebSrica {
53*f875b4ebSrica 	int	rc = 0;
54*f875b4ebSrica 	char	*label;
55*f875b4ebSrica 
56*f875b4ebSrica 	(void) setlocale(LC_ALL, "");
57*f875b4ebSrica #if !defined(TEXT_DOMAIN)	/* Should be defined by cc -D */
58*f875b4ebSrica #define	TEXT_DOMAIN	"SYS_TEST"	/* Use this only if it weren't */
59*f875b4ebSrica #endif
60*f875b4ebSrica 	(void) textdomain(TEXT_DOMAIN);
61*f875b4ebSrica 
62*f875b4ebSrica 	if ((prog = strrchr(argv[0], '/')) == NULL)
63*f875b4ebSrica 		prog = argv[0];
64*f875b4ebSrica 	else
65*f875b4ebSrica 		prog++;
66*f875b4ebSrica 
67*f875b4ebSrica 	if (argc < 3) {
68*f875b4ebSrica 		usage();
69*f875b4ebSrica 		return (2);
70*f875b4ebSrica 	}
71*f875b4ebSrica 
72*f875b4ebSrica 	argv++;
73*f875b4ebSrica 	argc--;
74*f875b4ebSrica 
75*f875b4ebSrica 	label = *argv;
76*f875b4ebSrica 	argv++;
77*f875b4ebSrica 	argc--;
78*f875b4ebSrica 	while (argc-- > 0) {
79*f875b4ebSrica 		if (set_label(*argv++, label) != 0)
80*f875b4ebSrica 			rc = 1;
81*f875b4ebSrica 	}
82*f875b4ebSrica 
83*f875b4ebSrica 	return (rc);
84*f875b4ebSrica }
85*f875b4ebSrica 
86*f875b4ebSrica static int
set_label(char * filename,char * label)87*f875b4ebSrica set_label(char *filename, char *label)
88*f875b4ebSrica {
89*f875b4ebSrica 	int rval = 0;
90*f875b4ebSrica 	int err;
91*f875b4ebSrica 	m_label_t *blabel;
92*f875b4ebSrica 
93*f875b4ebSrica 	if ((blabel = m_label_alloc(MAC_LABEL)) == NULL) {
94*f875b4ebSrica 		(void) fprintf(stderr, "setlabel: ");
95*f875b4ebSrica 		perror(filename);
96*f875b4ebSrica 		return (2);
97*f875b4ebSrica 	}
98*f875b4ebSrica 	rval = getlabel(filename, blabel);
99*f875b4ebSrica 	if (rval) {
100*f875b4ebSrica 		(void) fprintf(stderr, "setlabel: ");
101*f875b4ebSrica 		perror(filename);
102*f875b4ebSrica 		return (rval);
103*f875b4ebSrica 	}
104*f875b4ebSrica 	if (!bslvalid(blabel)) {
105*f875b4ebSrica 		(void) fprintf(stderr,
106*f875b4ebSrica 		    gettext("%s: Current label is invalid\n"),
107*f875b4ebSrica 		    filename);
108*f875b4ebSrica 		blabel = NULL;
109*f875b4ebSrica 	}
110*f875b4ebSrica 	if (str_to_label(label, &blabel, MAC_LABEL, L_DEFAULT, &err) == -1) {
111*f875b4ebSrica 		m_label_err(label, err);
112*f875b4ebSrica 	}
113*f875b4ebSrica 
114*f875b4ebSrica 	rval = setlabel(filename, blabel);
115*f875b4ebSrica 	if (rval == 0)
116*f875b4ebSrica 		m_label_free(blabel);
117*f875b4ebSrica 	return (rval);
118*f875b4ebSrica }
119*f875b4ebSrica 
120*f875b4ebSrica static int
setlabel(char * filename,bslabel_t * label)121*f875b4ebSrica setlabel(char *filename, bslabel_t *label)
122*f875b4ebSrica {
123*f875b4ebSrica 	int	rval;
124*f875b4ebSrica 
125*f875b4ebSrica 	rval = setflabel(filename, label);
126*f875b4ebSrica 
127*f875b4ebSrica 	if (rval) {
128*f875b4ebSrica 		(void) fprintf(stderr, "setlabel: ");
129*f875b4ebSrica 		perror(filename);
130*f875b4ebSrica 	}
131*f875b4ebSrica 	return (rval);
132*f875b4ebSrica }
133*f875b4ebSrica 
134*f875b4ebSrica static void
m_label_err(const char * ascii,const int err)135*f875b4ebSrica m_label_err(const char *ascii, const int err)
136*f875b4ebSrica {
137*f875b4ebSrica 	if (errno == EINVAL) {
138*f875b4ebSrica 		switch (err) {
139*f875b4ebSrica 		case M_BAD_STRING:
140*f875b4ebSrica 			(void) fprintf(stderr,
141*f875b4ebSrica 			    gettext("setlabel: bad string %s\n"), ascii);
142*f875b4ebSrica 		break;
143*f875b4ebSrica 		case M_BAD_LABEL:
144*f875b4ebSrica 			(void) fprintf(stderr,
145*f875b4ebSrica 			    gettext("setlabel: bad previous label\n"));
146*f875b4ebSrica 		break;
147*f875b4ebSrica 		default:
148*f875b4ebSrica 			(void) fprintf(stderr,
149*f875b4ebSrica 			    gettext("setlabel: parsing error found in "
150*f875b4ebSrica 			    "\"%s\" at position %d\n"), ascii, err);
151*f875b4ebSrica 		break;
152*f875b4ebSrica 		}
153*f875b4ebSrica 	} else {
154*f875b4ebSrica 		perror("setlabel");
155*f875b4ebSrica 	}
156*f875b4ebSrica 	exit(1);
157*f875b4ebSrica }
158*f875b4ebSrica /*
159*f875b4ebSrica  * usage()
160*f875b4ebSrica  *
161*f875b4ebSrica  * This routine is called whenever there is a usage type of error has
162*f875b4ebSrica  * occured.  For example, when a invalid option has has been specified.
163*f875b4ebSrica  *
164*f875b4ebSrica  */
165*f875b4ebSrica static void
usage(void)166*f875b4ebSrica usage(void)
167*f875b4ebSrica {
168*f875b4ebSrica 
169*f875b4ebSrica 	(void) fprintf(stderr, gettext("Usage: \n"));
170*f875b4ebSrica 	(void) fprintf(stderr, gettext(
171*f875b4ebSrica 	    "	%s newlabel filename [...] \n"), prog);
172*f875b4ebSrica 
173*f875b4ebSrica }
174