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