1355b4669Sjacobs /*
2355b4669Sjacobs * CDDL HEADER START
3355b4669Sjacobs *
4355b4669Sjacobs * The contents of this file are subject to the terms of the
5355b4669Sjacobs * Common Development and Distribution License (the "License").
6355b4669Sjacobs * You may not use this file except in compliance with the License.
7355b4669Sjacobs *
8355b4669Sjacobs * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9355b4669Sjacobs * or http://www.opensolaris.org/os/licensing.
10355b4669Sjacobs * See the License for the specific language governing permissions
11355b4669Sjacobs * and limitations under the License.
12355b4669Sjacobs *
13355b4669Sjacobs * When distributing Covered Code, include this CDDL HEADER in each
14355b4669Sjacobs * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15355b4669Sjacobs * If applicable, add the following below this CDDL HEADER, with the
16355b4669Sjacobs * fields enclosed by brackets "[]" replaced with your own identifying
17355b4669Sjacobs * information: Portions Copyright [yyyy] [name of copyright owner]
18355b4669Sjacobs *
19355b4669Sjacobs * CDDL HEADER END
20355b4669Sjacobs */
21355b4669Sjacobs /*
22*c1ecd8b9Sjacobs * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
23355b4669Sjacobs * Use is subject to license terms.
24355b4669Sjacobs */
25355b4669Sjacobs
26355b4669Sjacobs #pragma ident "%Z%%M% %I% %E% SMI"
27355b4669Sjacobs
28355b4669Sjacobs /*
29355b4669Sjacobs * This file contains routines necessary to convert a string buffer into
30355b4669Sjacobs * a printer object.
31355b4669Sjacobs */
32355b4669Sjacobs
33355b4669Sjacobs #include <stdio.h>
34355b4669Sjacobs #include <stdlib.h>
35355b4669Sjacobs #include <unistd.h>
36355b4669Sjacobs #include <sys/types.h>
37355b4669Sjacobs #include <string.h>
38355b4669Sjacobs #include <stdarg.h>
39355b4669Sjacobs #include <syslog.h>
40355b4669Sjacobs
41355b4669Sjacobs #include <ns.h>
42355b4669Sjacobs #include <list.h>
43355b4669Sjacobs
44355b4669Sjacobs #define ESCAPE_CHARS "\\\n=:" /* \, \n, =, : */
45355b4669Sjacobs
46355b4669Sjacobs /*
47355b4669Sjacobs * Just like strncat(3C), but escapes the supplied characters.
48355b4669Sjacobs * This allows the escape character '\' and seperators to be part of the
49355b4669Sjacobs * keys or values.
50355b4669Sjacobs */
51355b4669Sjacobs char *
strncat_escaped(char * d,char * s,int len,char * escape)52355b4669Sjacobs strncat_escaped(char *d, char *s, int len, char *escape)
53355b4669Sjacobs {
54355b4669Sjacobs char *t = d;
55355b4669Sjacobs
56355b4669Sjacobs while ((*t != NULL) && (len > 0))
57355b4669Sjacobs len--, t++;
58355b4669Sjacobs
59355b4669Sjacobs if (escape == NULL)
60355b4669Sjacobs escape = "\\";
61355b4669Sjacobs
62355b4669Sjacobs while ((*s != NULL) && (len > 0)) {
63355b4669Sjacobs if (strchr(escape, *s) != NULL)
64355b4669Sjacobs len--, *t++ = '\\';
65355b4669Sjacobs len--, *t++ = *s++;
66355b4669Sjacobs }
67355b4669Sjacobs *t = NULL;
68355b4669Sjacobs
69355b4669Sjacobs return (d);
70355b4669Sjacobs }
71355b4669Sjacobs
72355b4669Sjacobs
73355b4669Sjacobs
74355b4669Sjacobs char *
_cvt_printer_to_entry(ns_printer_t * printer,char * buf,int buflen)75355b4669Sjacobs _cvt_printer_to_entry(ns_printer_t *printer, char *buf, int buflen)
76355b4669Sjacobs {
77355b4669Sjacobs int i, len;
78355b4669Sjacobs int bufferok = 1;
79355b4669Sjacobs
80355b4669Sjacobs (void) memset(buf, NULL, buflen);
81355b4669Sjacobs
82355b4669Sjacobs if ((printer == NULL) || (printer->attributes == NULL))
83355b4669Sjacobs return (NULL);
84355b4669Sjacobs
85355b4669Sjacobs if (snprintf(buf, buflen, "%s", printer->name) >= buflen) {
86355b4669Sjacobs (void) memset(buf, NULL, buflen);
87355b4669Sjacobs syslog(LOG_ERR, "_cvt_printer_to_entry: buffer overflow");
88355b4669Sjacobs return (NULL);
89355b4669Sjacobs }
90355b4669Sjacobs
91355b4669Sjacobs if ((printer->aliases != NULL) && (printer->aliases[0] != NULL)) {
92355b4669Sjacobs char **alias = printer->aliases;
93355b4669Sjacobs
94355b4669Sjacobs while (*alias != NULL) {
95355b4669Sjacobs (void) strlcat(buf, "|", buflen);
96355b4669Sjacobs (void) strncat_escaped(buf, *alias++, buflen,
97355b4669Sjacobs ESCAPE_CHARS);
98355b4669Sjacobs }
99355b4669Sjacobs }
100355b4669Sjacobs
101355b4669Sjacobs if (strlcat(buf, ":", buflen) >= buflen) {
102355b4669Sjacobs (void) memset(buf, NULL, buflen);
103355b4669Sjacobs syslog(LOG_ERR, "_cvt_printer_to_entry: buffer overflow");
104355b4669Sjacobs return (NULL);
105355b4669Sjacobs }
106355b4669Sjacobs
107355b4669Sjacobs len = strlen(buf);
108355b4669Sjacobs
109355b4669Sjacobs for (i = 0; printer->attributes[i] != NULL && bufferok; i++) {
110355b4669Sjacobs ns_kvp_t *kvp = printer->attributes[i];
111355b4669Sjacobs
112355b4669Sjacobs if (kvp->value == NULL)
113355b4669Sjacobs continue;
114355b4669Sjacobs (void) strlcat(buf, "\\\n\t:", buflen);
115355b4669Sjacobs (void) strncat_escaped(buf, kvp->key, buflen, ESCAPE_CHARS);
116355b4669Sjacobs (void) strlcat(buf, "=", buflen);
117355b4669Sjacobs (void) strncat_escaped(buf, kvp->value, buflen, ESCAPE_CHARS);
118355b4669Sjacobs if (strlcat(buf, ":", buflen) >= buflen) {
119355b4669Sjacobs bufferok = 0;
120355b4669Sjacobs }
121355b4669Sjacobs }
122355b4669Sjacobs
123355b4669Sjacobs if (!bufferok) {
124355b4669Sjacobs (void) memset(buf, NULL, buflen);
125355b4669Sjacobs syslog(LOG_ERR, "_cvt_printer_to_entry: buffer overflow");
126355b4669Sjacobs return (NULL);
127355b4669Sjacobs }
128355b4669Sjacobs
129355b4669Sjacobs if (strlen(buf) == len) { /* there were no attributes */
130355b4669Sjacobs (void) memset(buf, NULL, buflen);
131355b4669Sjacobs buf = NULL;
132355b4669Sjacobs }
133355b4669Sjacobs
134355b4669Sjacobs return (buf);
135355b4669Sjacobs }
136355b4669Sjacobs
137355b4669Sjacobs
138355b4669Sjacobs ns_printer_t *
_cvt_nss_entry_to_printer(char * entry,char * ns)139355b4669Sjacobs _cvt_nss_entry_to_printer(char *entry, char *ns)
140355b4669Sjacobs {
141355b4669Sjacobs char *name = NULL,
142355b4669Sjacobs *key = NULL,
143355b4669Sjacobs **aliases = NULL,
144355b4669Sjacobs *cp,
145355b4669Sjacobs buf[BUFSIZ];
146355b4669Sjacobs int in_namelist = 1, buf_pos = 0;
147355b4669Sjacobs ns_printer_t *printer = NULL;
148355b4669Sjacobs
149355b4669Sjacobs if (entry == NULL)
150355b4669Sjacobs return (NULL);
151355b4669Sjacobs
152355b4669Sjacobs (void) memset(buf, NULL, sizeof (buf));
153355b4669Sjacobs for (cp = entry; *cp != NULL; cp++) {
154355b4669Sjacobs switch (*cp) {
155355b4669Sjacobs case ':': /* end of kvp */
156355b4669Sjacobs if (in_namelist != 0) {
157355b4669Sjacobs if (name == NULL)
158355b4669Sjacobs name = strdup(buf);
159355b4669Sjacobs else
160355b4669Sjacobs aliases = (char **)list_append(
161355b4669Sjacobs (void **)aliases,
162355b4669Sjacobs (void *)strdup(buf));
163355b4669Sjacobs printer = (ns_printer_t *)ns_printer_create(
164355b4669Sjacobs name, aliases, ns, NULL);
165355b4669Sjacobs in_namelist = 0;
166355b4669Sjacobs } else if (key != NULL)
167355b4669Sjacobs (void) ns_set_value_from_string(key, buf,
168355b4669Sjacobs printer);
169355b4669Sjacobs (void) memset(buf, NULL, sizeof (buf));
170355b4669Sjacobs buf_pos = 0;
171355b4669Sjacobs key = NULL;
172355b4669Sjacobs break;
173355b4669Sjacobs case '=': /* kvp seperator */
174355b4669Sjacobs if (key == NULL) {
175355b4669Sjacobs key = strdup(buf);
176355b4669Sjacobs (void) memset(buf, NULL, sizeof (buf));
177355b4669Sjacobs buf_pos = 0;
178355b4669Sjacobs } else
179355b4669Sjacobs buf[buf_pos++] = *cp;
180355b4669Sjacobs break;
181355b4669Sjacobs case '|': /* namelist seperator */
182355b4669Sjacobs if (in_namelist != 0) {
183355b4669Sjacobs if (name == NULL)
184355b4669Sjacobs name = strdup(buf);
185355b4669Sjacobs else
186355b4669Sjacobs aliases = (char **)list_append(
187355b4669Sjacobs (void **)aliases,
188355b4669Sjacobs (void *)strdup(buf));
189355b4669Sjacobs (void) memset(buf, NULL, sizeof (buf));
190355b4669Sjacobs buf_pos = 0;
191355b4669Sjacobs } else /* add it to the buffer */
192355b4669Sjacobs buf[buf_pos++] = *cp;
193355b4669Sjacobs break;
194355b4669Sjacobs case '\\': /* escape char */
195355b4669Sjacobs buf[buf_pos++] = *(++cp);
196355b4669Sjacobs break;
197355b4669Sjacobs default:
198355b4669Sjacobs buf[buf_pos++] = *cp;
199355b4669Sjacobs }
200355b4669Sjacobs
201355b4669Sjacobs }
202355b4669Sjacobs
203355b4669Sjacobs if (key != NULL)
204355b4669Sjacobs (void) ns_set_value_from_string(key, buf, printer);
205355b4669Sjacobs
206355b4669Sjacobs return (printer);
207355b4669Sjacobs }
208