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
main(int argc,char ** argv)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
set_label(char * filename,char * label)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
setlabel(char * filename,bslabel_t * label)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
m_label_err(const char * ascii,const int err)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
usage(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