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