1f875b4ebSrica /*
2f875b4ebSrica  * CDDL HEADER START
3f875b4ebSrica  *
4f875b4ebSrica  * The contents of this file are subject to the terms of the
5f875b4ebSrica  * Common Development and Distribution License (the "License").
6f875b4ebSrica  * You may not use this file except in compliance with the License.
7f875b4ebSrica  *
8f875b4ebSrica  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9f875b4ebSrica  * or http://www.opensolaris.org/os/licensing.
10f875b4ebSrica  * See the License for the specific language governing permissions
11f875b4ebSrica  * and limitations under the License.
12f875b4ebSrica  *
13f875b4ebSrica  * When distributing Covered Code, include this CDDL HEADER in each
14f875b4ebSrica  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15f875b4ebSrica  * If applicable, add the following below this CDDL HEADER, with the
16f875b4ebSrica  * fields enclosed by brackets "[]" replaced with your own identifying
17f875b4ebSrica  * information: Portions Copyright [yyyy] [name of copyright owner]
18f875b4ebSrica  *
19f875b4ebSrica  * CDDL HEADER END
20f875b4ebSrica  */
21f875b4ebSrica 
22f875b4ebSrica /*
23*50981ffcSTony Nguyen  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24f875b4ebSrica  * Use is subject to license terms.
25f875b4ebSrica  */
26f875b4ebSrica 
27f875b4ebSrica 
28f875b4ebSrica /*
29f875b4ebSrica  *	hextoalabel - Convert an internal label to its human readable
30f875b4ebSrica  *		      equivalent.
31f875b4ebSrica  */
32f875b4ebSrica 
33f875b4ebSrica #include <errno.h>
34f875b4ebSrica #include <libintl.h>
35f875b4ebSrica #include <locale.h>
36f875b4ebSrica #include <stdio.h>
37f875b4ebSrica #include <stdlib.h>
38f875b4ebSrica #include <string.h>
39f875b4ebSrica #include <unistd.h>
40*50981ffcSTony Nguyen #include <stropts.h>
41f875b4ebSrica 
42f875b4ebSrica #include <sys/param.h>
43f875b4ebSrica 
44f875b4ebSrica #include <tsol/label.h>
45f875b4ebSrica 
46f875b4ebSrica #if !defined(TEXT_DOMAIN)
47f875b4ebSrica #define	TEXT_DOMAIN	"SYS_TEST"
48f875b4ebSrica #endif	/* !defined(TEXT_DOMAIN) */
49f875b4ebSrica 
50f875b4ebSrica static void
label_error(const char * hex,const int err)51f875b4ebSrica label_error(const char *hex, const int err)
52f875b4ebSrica {
53f875b4ebSrica 	if (errno == EINVAL) {
54f875b4ebSrica 		switch (err) {
55f875b4ebSrica 		case M_BAD_STRING:
56f875b4ebSrica 			(void) fprintf(stderr,
57f875b4ebSrica 			    gettext("hextoalabel: bad string %s\n"), hex);
58f875b4ebSrica 		break;
59f875b4ebSrica 		case M_BAD_LABEL:
60f875b4ebSrica 			(void) fprintf(stderr,
61f875b4ebSrica 			    gettext("hextoalabel: bad previous label\n"));
62f875b4ebSrica 		break;
63f875b4ebSrica 		default:
64f875b4ebSrica 			(void) fprintf(stderr,
65f875b4ebSrica 			    gettext("hextoalabel: parsing error found in "
66f875b4ebSrica 			    "\"%s\" at position %d\n"), hex, err);
67f875b4ebSrica 		break;
68f875b4ebSrica 		}
69f875b4ebSrica 	} else {
70f875b4ebSrica 		perror("hextoalabel");
71f875b4ebSrica 	}
72f875b4ebSrica 	exit(1);
73f875b4ebSrica 	/*NOTREACHED*/
74f875b4ebSrica }
75f875b4ebSrica 
76f875b4ebSrica int
main(int argc,char ** argv)77f875b4ebSrica main(int argc, char **argv)
78f875b4ebSrica {
79f875b4ebSrica 	int cflg = 0;			/* true if Clearance only */
80f875b4ebSrica 	int errflg = 0;			/* true if arg error */
81f875b4ebSrica 	m_label_t *label = NULL;
82f875b4ebSrica 	char hex[PIPE_BUF];		/* internal label */
83f875b4ebSrica 	char *ascii = NULL;		/* human readable label to print */
84f875b4ebSrica 	int err = 0;			/* label error */
85f875b4ebSrica 	int c;
86f875b4ebSrica 
87f875b4ebSrica 	(void) setlocale(LC_ALL, "");
88f875b4ebSrica 	(void) textdomain(TEXT_DOMAIN);
89f875b4ebSrica 
90f875b4ebSrica 	opterr = 0;
91f875b4ebSrica 	while ((c = getopt(argc, argv, "c")) != EOF) {
92f875b4ebSrica 
93f875b4ebSrica 		switch (c) {
94f875b4ebSrica 		case 'c':
95f875b4ebSrica 			cflg++;
96f875b4ebSrica 			break;
97f875b4ebSrica 		default:
98f875b4ebSrica 			errflg++;
99f875b4ebSrica 			break;
100f875b4ebSrica 		}
101f875b4ebSrica 	}
102f875b4ebSrica 
103f875b4ebSrica 	argc -= optind - 1;
104f875b4ebSrica 	if (errflg || argc > 2) {
105f875b4ebSrica 
106f875b4ebSrica 		(void) fprintf(stderr,
107f875b4ebSrica 		    gettext("usage: %s [-c] [hexadecimal label]\n"), argv[0]);
108f875b4ebSrica 		exit(1);
109f875b4ebSrica 		/*NOTREACHED*/
110f875b4ebSrica 	}
111f875b4ebSrica 
112f875b4ebSrica 	if (argc == 2) {
113f875b4ebSrica 		/* use label on command line */
114f875b4ebSrica 
115f875b4ebSrica 		(void) strlcpy(hex, argv[optind], sizeof (hex));
116f875b4ebSrica 	} else {
117f875b4ebSrica 		/* read label from standard input */
118f875b4ebSrica 
119*50981ffcSTony Nguyen 		if ((c = read(STDIN_FILENO, hex, sizeof (hex))) <= 0) {
120f875b4ebSrica 
121f875b4ebSrica 			perror(gettext("reading hexadecimal label"));
122f875b4ebSrica 			exit(1);
123f875b4ebSrica 			/*NOTREACHED*/
124f875b4ebSrica 		}
125*50981ffcSTony Nguyen 
126*50981ffcSTony Nguyen 		/*
127*50981ffcSTony Nguyen 		 * replace '\n' or (end of buffer) with end of string.
128*50981ffcSTony Nguyen 		 */
129*50981ffcSTony Nguyen 		hex[c-1] = '\0';
130*50981ffcSTony Nguyen 
131*50981ffcSTony Nguyen 		/*
132*50981ffcSTony Nguyen 		 * flush any remaining input past the size of the buffer.
133*50981ffcSTony Nguyen 		 */
134*50981ffcSTony Nguyen 		(void) ioctl(STDIN_FILENO, I_FLUSH, FLUSHR);
135f875b4ebSrica 	}
136f875b4ebSrica 
137f875b4ebSrica 	if (cflg) {
138f875b4ebSrica 		if (str_to_label(hex, &label, USER_CLEAR, L_NO_CORRECTION,
139f875b4ebSrica 		    &err) == -1) {
140f875b4ebSrica 			label_error(hex, err);
141f875b4ebSrica 		}
142f875b4ebSrica 		if (label_to_str(label, &ascii, M_LABEL, DEF_NAMES) != 0) {
143f875b4ebSrica 			perror("label_to_str");
144f875b4ebSrica 			exit(1);
145f875b4ebSrica 		}
146f875b4ebSrica 		(void) printf("%s\n", ascii);
147f875b4ebSrica 		m_label_free(label);
148f875b4ebSrica 		free(ascii);
149f875b4ebSrica 	} else {
150f875b4ebSrica 		if (str_to_label(hex, &label, MAC_LABEL, L_NO_CORRECTION,
151f875b4ebSrica 		    &err) == -1) {
152f875b4ebSrica 			label_error(hex, err);
153f875b4ebSrica 		}
154f875b4ebSrica 		if (label_to_str(label, &ascii, M_LABEL, DEF_NAMES) != 0) {
155f875b4ebSrica 			perror("label_to_str");
156f875b4ebSrica 			exit(1);
157f875b4ebSrica 		}
158f875b4ebSrica 		(void) printf("%s\n", ascii);
159f875b4ebSrica 		m_label_free(label);
160f875b4ebSrica 		free(ascii);
161f875b4ebSrica 	}
162f875b4ebSrica 
163f875b4ebSrica 	return (0);	/* really exit(0); */
164f875b4ebSrica }
165