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