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