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