xref: /illumos-gate/usr/src/lib/print/libprint/common/ns_bsd_addr.c (revision f4593de73bc951089c91679a1104a589e85475d4)
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 /*
22c1ecd8b9Sjacobs  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23355b4669Sjacobs  * Use is subject to license terms.
24355b4669Sjacobs  */
25355b4669Sjacobs 
26355b4669Sjacobs /*LINTLIBRARY*/
27355b4669Sjacobs 
28355b4669Sjacobs #include <stdio.h>
29355b4669Sjacobs #include <stdlib.h>
30355b4669Sjacobs #include <unistd.h>
31355b4669Sjacobs #include <sys/types.h>
32355b4669Sjacobs #include <stdarg.h>
33355b4669Sjacobs #include <string.h>
34355b4669Sjacobs #include <syslog.h>
35355b4669Sjacobs 
36355b4669Sjacobs #include <ns.h>
37355b4669Sjacobs #include <list.h>
38c1ecd8b9Sjacobs 
39c1ecd8b9Sjacobs static char **
strsplit(char * string,char * seperators)40c1ecd8b9Sjacobs strsplit(char *string, char *seperators)
41c1ecd8b9Sjacobs {
42c1ecd8b9Sjacobs 	char **list = NULL;
43c1ecd8b9Sjacobs 	char *where = NULL;
44c1ecd8b9Sjacobs 	char *element;
45c1ecd8b9Sjacobs 
46c1ecd8b9Sjacobs 	for (element = strtok_r(string, seperators, &where); element != NULL;
47c1ecd8b9Sjacobs 	    element = strtok_r(NULL, seperators, &where))
48c1ecd8b9Sjacobs 		list = (char **)list_append((void **)list, element);
49c1ecd8b9Sjacobs 
50c1ecd8b9Sjacobs 	return (list);
51c1ecd8b9Sjacobs }
52355b4669Sjacobs 
53355b4669Sjacobs /*
54355b4669Sjacobs  *	Manipulate bsd_addr structures
55355b4669Sjacobs  */
56355b4669Sjacobs ns_bsd_addr_t *
bsd_addr_create(const char * server,const char * printer,const char * extension)57355b4669Sjacobs bsd_addr_create(const char *server, const char *printer, const char *extension)
58355b4669Sjacobs {
59355b4669Sjacobs 	ns_bsd_addr_t *addr = NULL;
60355b4669Sjacobs 
61355b4669Sjacobs 	if ((server != NULL) &&
62355b4669Sjacobs 	    ((addr = calloc(1, sizeof (*addr))) != NULL)) {
63355b4669Sjacobs 		addr->printer = (char *)printer;
64355b4669Sjacobs 		addr->server = (char *)server;
65355b4669Sjacobs 		addr->extension = (char *)extension;
66355b4669Sjacobs 	}
67355b4669Sjacobs 
68355b4669Sjacobs 	return (addr);
69355b4669Sjacobs }
70355b4669Sjacobs 
71355b4669Sjacobs static char *
bsd_addr_to_string(const ns_bsd_addr_t * addr)72355b4669Sjacobs bsd_addr_to_string(const ns_bsd_addr_t *addr)
73355b4669Sjacobs {
74355b4669Sjacobs 	char buf[BUFSIZ];
75355b4669Sjacobs 
76355b4669Sjacobs 	if ((addr == NULL) || (addr->server == NULL))
77355b4669Sjacobs 		return (NULL);
78355b4669Sjacobs 
79355b4669Sjacobs 	if (snprintf(buf, sizeof (buf), "%s", addr->server) >= sizeof (buf)) {
80355b4669Sjacobs 		syslog(LOG_ERR, "bsd_addr_to_string: buffer overflow");
81355b4669Sjacobs 		return (NULL);
82355b4669Sjacobs 	}
83355b4669Sjacobs 
84355b4669Sjacobs 	if ((addr->printer != NULL) || (addr->extension != NULL))
85355b4669Sjacobs 		(void) strlcat(buf, ",", sizeof (buf));
86355b4669Sjacobs 	if (addr->printer != NULL)
87355b4669Sjacobs 		if (strlcat(buf, addr->printer, sizeof (buf)) >= sizeof (buf)) {
88355b4669Sjacobs 			syslog(LOG_ERR, "bsd_addr_to_string: buffer overflow");
89355b4669Sjacobs 			return (NULL);
90355b4669Sjacobs 		}
91355b4669Sjacobs 	if (addr->extension != NULL) {
92355b4669Sjacobs 		(void) strlcat(buf, ",", sizeof (buf));
93355b4669Sjacobs 		if (strlcat(buf, addr->extension, sizeof (buf))
94355b4669Sjacobs 		    >= sizeof (buf)) {
95355b4669Sjacobs 			syslog(LOG_ERR, "bsd_addr_to_string: buffer overflow");
96355b4669Sjacobs 			return (NULL);
97355b4669Sjacobs 		}
98355b4669Sjacobs 	}
99355b4669Sjacobs 
100355b4669Sjacobs 	return (strdup(buf));
101355b4669Sjacobs }
102355b4669Sjacobs 
103355b4669Sjacobs ns_bsd_addr_t *
string_to_bsd_addr(const char * string)104355b4669Sjacobs string_to_bsd_addr(const char *string)
105355b4669Sjacobs {
106355b4669Sjacobs 	char **list, *tmp, *printer = NULL, *extension = NULL;
107355b4669Sjacobs 
108355b4669Sjacobs 	if (string == NULL)
109355b4669Sjacobs 		return (NULL);
110355b4669Sjacobs 
111355b4669Sjacobs 	tmp = strdup(string);
112355b4669Sjacobs 	list = strsplit(tmp, ",");
113355b4669Sjacobs 
114355b4669Sjacobs 	if (list[1] != NULL) {
115355b4669Sjacobs 		printer = list[1];
116355b4669Sjacobs 		if (list[2] != NULL)
117355b4669Sjacobs 			extension = list[2];
118355b4669Sjacobs 	}
119355b4669Sjacobs 
120355b4669Sjacobs 	return (bsd_addr_create(list[0], printer, extension));
121355b4669Sjacobs }
122355b4669Sjacobs 
123355b4669Sjacobs static char *
list_to_string(const char ** list)124355b4669Sjacobs list_to_string(const char **list)
125355b4669Sjacobs {
126355b4669Sjacobs 	char buf[BUFSIZ];
127355b4669Sjacobs 
128355b4669Sjacobs 	if ((list == NULL) || (*list == NULL))
129355b4669Sjacobs 		return (NULL);
130355b4669Sjacobs 
131355b4669Sjacobs 	if (snprintf(buf, sizeof (buf), "%s", *list) >= sizeof (buf)) {
132355b4669Sjacobs 		syslog(LOG_ERR, "list_to_string: buffer overflow");
133355b4669Sjacobs 		return (NULL);
134355b4669Sjacobs 	}
135355b4669Sjacobs 
136355b4669Sjacobs 	while (*++list != NULL) {
137355b4669Sjacobs 		(void) strlcat(buf, ",", sizeof (buf));
138355b4669Sjacobs 		if (strlcat(buf, *list, sizeof (buf)) >= sizeof (buf)) {
139355b4669Sjacobs 			syslog(LOG_ERR, "list_to_string: buffer overflow");
140355b4669Sjacobs 			return (NULL);
141355b4669Sjacobs 		}
142355b4669Sjacobs 	}
143355b4669Sjacobs 
144355b4669Sjacobs 	return (strdup(buf));
145355b4669Sjacobs }
146355b4669Sjacobs 
147355b4669Sjacobs static char *
internal_list_to_string(const ns_printer_t ** list)148355b4669Sjacobs internal_list_to_string(const ns_printer_t **list)
149355b4669Sjacobs {
150355b4669Sjacobs 	char buf[BUFSIZ];
151355b4669Sjacobs 
152355b4669Sjacobs 	if ((list == NULL) || (*list == NULL))
153355b4669Sjacobs 		return (NULL);
154355b4669Sjacobs 
155355b4669Sjacobs 	if (snprintf(buf, sizeof (buf), "%s", (*list)->name) >= sizeof (buf)) {
156355b4669Sjacobs 		syslog(LOG_ERR, "internal_list_to_string:buffer overflow");
157355b4669Sjacobs 		return (NULL);
158355b4669Sjacobs 	}
159355b4669Sjacobs 
160355b4669Sjacobs 	while (*++list != NULL) {
161355b4669Sjacobs 		(void) strlcat(buf, ",", sizeof (buf));
162355b4669Sjacobs 		if (strlcat(buf, (*list)->name, sizeof (buf)) >= sizeof (buf)) {
163355b4669Sjacobs 			syslog(LOG_ERR,
164355b4669Sjacobs 			    "internal_list_to_string:buffer overflow");
165355b4669Sjacobs 			return (NULL);
166355b4669Sjacobs 		}
167355b4669Sjacobs 	}
168355b4669Sjacobs 
169355b4669Sjacobs 	return (strdup(buf));
170355b4669Sjacobs }
171355b4669Sjacobs 
172355b4669Sjacobs 
173355b4669Sjacobs char *
value_to_string(const char * key,void * value)174355b4669Sjacobs value_to_string(const char *key, void *value)
175355b4669Sjacobs {
176355b4669Sjacobs 	char *string = NULL;
177355b4669Sjacobs 
178355b4669Sjacobs 	if ((key != NULL) && (value != NULL)) {
179355b4669Sjacobs 		if (strcmp(key, NS_KEY_BSDADDR) == 0) {
180355b4669Sjacobs 			string = bsd_addr_to_string(value);
181355b4669Sjacobs 		} else if ((strcmp(key, NS_KEY_ALL) == 0) ||
182355b4669Sjacobs 		    (strcmp(key, NS_KEY_GROUP) == 0)) {
183355b4669Sjacobs 			string = list_to_string(value);
184355b4669Sjacobs 		} else if (strcmp(key, NS_KEY_LIST) == 0) {
185355b4669Sjacobs 			string = internal_list_to_string(value);
186355b4669Sjacobs 		} else {
187355b4669Sjacobs 			string = strdup((char *)value);
188355b4669Sjacobs 		}
189355b4669Sjacobs 	}
190355b4669Sjacobs 
191355b4669Sjacobs 	return (string);
192355b4669Sjacobs }
193355b4669Sjacobs 
194355b4669Sjacobs 
195355b4669Sjacobs void *
string_to_value(const char * key,char * string)196355b4669Sjacobs string_to_value(const char *key, char *string)
197355b4669Sjacobs {
198355b4669Sjacobs 	void *value = NULL;
199355b4669Sjacobs 
200*f4593de7SToomas Soome 	if ((key != NULL) && (string != NULL) && (string[0] != '\0')) {
201355b4669Sjacobs 		if (strcmp(key, NS_KEY_BSDADDR) == 0) {
202355b4669Sjacobs 			value = (void *)string_to_bsd_addr(string);
203355b4669Sjacobs 		} else if ((strcmp(key, NS_KEY_ALL) == 0) ||
204355b4669Sjacobs 		    (strcmp(key, NS_KEY_GROUP) == 0)) {
205355b4669Sjacobs 			value = (void *)strsplit(string, ",");
206355b4669Sjacobs 		} else {
207355b4669Sjacobs 			value = (void *)string;
208355b4669Sjacobs 		}
209355b4669Sjacobs 	}
210355b4669Sjacobs 
211355b4669Sjacobs 	return (value);
212355b4669Sjacobs }
213355b4669Sjacobs 
214355b4669Sjacobs static void
split_name(char * name,const char * delimiter,char ** p1,char ** p2,char ** p3)215355b4669Sjacobs split_name(char *name, const char *delimiter, char **p1, char **p2, char **p3)
216355b4669Sjacobs {
217355b4669Sjacobs 	char *tmp, *junk = NULL;
218355b4669Sjacobs 
219355b4669Sjacobs 	if (p1 != NULL)
220355b4669Sjacobs 		*p1 = NULL;
221355b4669Sjacobs 	if (p2 != NULL)
222355b4669Sjacobs 		*p2 = NULL;
223355b4669Sjacobs 	if (p3 != NULL)
224355b4669Sjacobs 		*p3 = NULL;
225355b4669Sjacobs 
226355b4669Sjacobs 	if ((name == NULL) || (delimiter == NULL)) {
227355b4669Sjacobs 		syslog(LOG_DEBUG, "split_name(): name/delimter invalid\n");
228355b4669Sjacobs 		return;
229355b4669Sjacobs 	}
230355b4669Sjacobs 
231355b4669Sjacobs 	for (tmp = (char *)strtok_r(name, delimiter, &junk); tmp != NULL;
232355b4669Sjacobs 	    tmp = (char *)strtok_r(NULL, delimiter, &junk))
233*f4593de7SToomas Soome 		if ((p1 != NULL) && (*p1 == NULL)) {
234355b4669Sjacobs 			*p1 = tmp;
235*f4593de7SToomas Soome 		} else if ((p2 != NULL) && (*p2 == NULL)) {
236355b4669Sjacobs 			*p2 = tmp;
237355b4669Sjacobs 			if (p3 == NULL)
238355b4669Sjacobs 				break;
239355b4669Sjacobs 		} else if ((p3 != NULL) && (*p3 == NULL)) {
240355b4669Sjacobs 			*p3 = tmp;
241355b4669Sjacobs 			break;
242355b4669Sjacobs 		}
243355b4669Sjacobs }
244355b4669Sjacobs 
245355b4669Sjacobs /*
246355b4669Sjacobs  * This implements support for printer names that are fully resolvable
247355b4669Sjacobs  * on their own.  These "complete" names are converted into a ns_printer_t
248355b4669Sjacobs  * structure containing an appropriate "bsdaddr" attribute.  The supported
249355b4669Sjacobs  * formats are as follows:
250355b4669Sjacobs  *	POSIX style (server:printer[:conformance]).
251355b4669Sjacobs  *		This format is an adaptation of the format originally
252355b4669Sjacobs  *		described in POSIX 1387.4.  The POSIX draft has since been
253355b4669Sjacobs  *		squashed, but this particular component lives on.  The
254355b4669Sjacobs  *		conformace field has been added to allow further identification
255355b4669Sjacobs  *		of the the server.
256355b4669Sjacobs  */
257355b4669Sjacobs ns_printer_t *
posix_name(const char * name)258355b4669Sjacobs posix_name(const char *name)
259355b4669Sjacobs {
260355b4669Sjacobs 	ns_printer_t *printer = NULL;
261355b4669Sjacobs 	char *tmp = NULL;
262355b4669Sjacobs 
263355b4669Sjacobs 	if ((name != NULL) && ((tmp = strpbrk(name, ":")) != NULL)) {
264355b4669Sjacobs 		char *server = NULL;
265355b4669Sjacobs 		char *queue = NULL;
266355b4669Sjacobs 		char *extension = NULL;
267355b4669Sjacobs 		char *addr = strdup(name);
268355b4669Sjacobs 		char buf[BUFSIZ];
269355b4669Sjacobs 
270355b4669Sjacobs 		if (*tmp == ':')
271355b4669Sjacobs 			split_name(addr, ": \t", &server, &queue, &extension);
272355b4669Sjacobs 
273355b4669Sjacobs 		memset(buf, 0, sizeof (buf));
274355b4669Sjacobs 		if ((server != NULL) && (queue != NULL))
275355b4669Sjacobs 			snprintf(buf, sizeof (buf), "%s,%s%s%s", server,
276355b4669Sjacobs 			    queue, (extension != NULL ? "," : ""),
277355b4669Sjacobs 			    (extension != NULL ? extension : ""));
278355b4669Sjacobs 
279355b4669Sjacobs 		/* build the structure here */
280*f4593de7SToomas Soome 		if (buf[0] != '\0') {
281355b4669Sjacobs 			ns_kvp_t **list, *kvp;
282355b4669Sjacobs 
283355b4669Sjacobs 			kvp = ns_kvp_create(NS_KEY_BSDADDR, buf);
284355b4669Sjacobs 			list = (ns_kvp_t **)list_append(NULL, kvp);
285355b4669Sjacobs 			if (list != NULL)
286355b4669Sjacobs 				printer = ns_printer_create(strdup(name), NULL,
287355b4669Sjacobs 				    "posix", list);
288355b4669Sjacobs 		}
289355b4669Sjacobs 	}
290355b4669Sjacobs 
291355b4669Sjacobs 	return (printer);
292355b4669Sjacobs }
293355b4669Sjacobs 
294355b4669Sjacobs /*
295355b4669Sjacobs  * FUNCTION:
296355b4669Sjacobs  *	int ns_bsd_addr_cmp(ns_bsd_addr_t *at, ns_bsd_addr_t *a2)
297355b4669Sjacobs  * INPUTS:
298355b4669Sjacobs  *	ns_bsd_addr_t *a1 - a bsd addr
299355b4669Sjacobs  *	ns_bsd_addr_t *21 - another bsd addr
300355b4669Sjacobs  * DESCRIPTION:
301355b4669Sjacobs  *	This functions compare 2 bsd_addr structures to determine if the
302355b4669Sjacobs  *	information in them is the same.
303355b4669Sjacobs  */
304355b4669Sjacobs static int
ns_bsd_addr_cmp(ns_bsd_addr_t * a1,ns_bsd_addr_t * a2)305355b4669Sjacobs ns_bsd_addr_cmp(ns_bsd_addr_t *a1, ns_bsd_addr_t *a2)
306355b4669Sjacobs {
307355b4669Sjacobs 	int rc;
308355b4669Sjacobs 
309355b4669Sjacobs 	if ((a1 == NULL) || (a2 == NULL))
310355b4669Sjacobs 		return (1);
311355b4669Sjacobs 
312355b4669Sjacobs 	if ((rc = strcmp(a1->server, a2->server)) != 0)
313355b4669Sjacobs 		return (rc);
314355b4669Sjacobs 
315355b4669Sjacobs 	if ((a1->printer == NULL) || (a2->printer == NULL))
316355b4669Sjacobs 		return (a1->printer != a2->printer);
317355b4669Sjacobs 
318355b4669Sjacobs 	return (strcmp(a1->printer, a2->printer));
319355b4669Sjacobs }
320355b4669Sjacobs 
321355b4669Sjacobs 
322355b4669Sjacobs 
323355b4669Sjacobs 
324355b4669Sjacobs /*
325355b4669Sjacobs  * FUNCTION:    ns_bsd_addr_cmp_local()
326355b4669Sjacobs  *
327355b4669Sjacobs  * DESCRIPTION: This function compares 2 bsd_addr structures to determine if
328355b4669Sjacobs  *              the information in them is the same. It destinquishes between
329355b4669Sjacobs  *              real printer names and alias names while doing the compare.
330355b4669Sjacobs  *
331355b4669Sjacobs  * INPUTS:      ns_bsd_addr_t *a1 - a bsd addr
332*f4593de7SToomas Soome  *              ns_bsd_addr_t *a2 - another bsd addr
333355b4669Sjacobs  */
334355b4669Sjacobs 
335355b4669Sjacobs static int
ns_bsd_addr_cmp_local(ns_bsd_addr_t * a1,ns_bsd_addr_t * a2)336355b4669Sjacobs ns_bsd_addr_cmp_local(ns_bsd_addr_t *a1, ns_bsd_addr_t *a2)
337355b4669Sjacobs {
338355b4669Sjacobs 	int rc;
339355b4669Sjacobs 
340*f4593de7SToomas Soome 	if ((a1 == NULL) || (a2 == NULL)) {
341355b4669Sjacobs 		return (1);
342355b4669Sjacobs 	}
343355b4669Sjacobs 
344*f4593de7SToomas Soome 	if ((rc = strcmp(a1->server, a2->server)) != 0) {
345355b4669Sjacobs 		return (rc);
346355b4669Sjacobs 	}
347355b4669Sjacobs 
348*f4593de7SToomas Soome 	if ((a1->printer == NULL) || (a2->printer == NULL)) {
349355b4669Sjacobs 		return (a1->printer != a2->printer);
350355b4669Sjacobs 	}
351355b4669Sjacobs 
352355b4669Sjacobs 	rc = strcmp(a1->printer, a2->printer);
353*f4593de7SToomas Soome 	if (rc == 0) {
354355b4669Sjacobs 		/*
355355b4669Sjacobs 		 * The printer's real names are the same, but now check if
356355b4669Sjacobs 		 * their local names (alias) are the same.
357355b4669Sjacobs 		 */
358355b4669Sjacobs 		rc = strcmp(a1->pname, a2->pname);
359355b4669Sjacobs 	}
360355b4669Sjacobs 
361355b4669Sjacobs 	return (rc);
362355b4669Sjacobs } /* ns_bsd_addr_cmp_local */
363355b4669Sjacobs 
364355b4669Sjacobs 
365355b4669Sjacobs 
366355b4669Sjacobs /*
367355b4669Sjacobs  * FUNCTION:
368355b4669Sjacobs  *	ns_bsd_addr_t *ns_bsd_addr_get_name(char *name)
369355b4669Sjacobs  * INPUTS:
370355b4669Sjacobs  *	char *name - name of printer to get address for
371355b4669Sjacobs  * OUTPUTS:
372355b4669Sjacobs  *	ns_bsd_addr_t *(return) - the address of the printer
373355b4669Sjacobs  * DESCRIPTION:
374355b4669Sjacobs  *	This function will get the BSD address of the printer specified.
375355b4669Sjacobs  *	it fills in the printer name if none is specified in the "name service"
376355b4669Sjacobs  *	as a convenience to calling functions.
377355b4669Sjacobs  */
378355b4669Sjacobs ns_bsd_addr_t *
ns_bsd_addr_get_name(char * name)379355b4669Sjacobs ns_bsd_addr_get_name(char *name)
380355b4669Sjacobs {
381355b4669Sjacobs 	ns_printer_t *printer;
382355b4669Sjacobs 	ns_bsd_addr_t *addr = NULL;
383355b4669Sjacobs 
384355b4669Sjacobs 	endprinterentry();
385355b4669Sjacobs 	if ((printer = ns_printer_get_name(name, NULL)) != NULL) {
386355b4669Sjacobs 		addr = ns_get_value(NS_KEY_BSDADDR, printer);
387355b4669Sjacobs 
388355b4669Sjacobs 		if (addr != NULL && addr->printer == NULL)
389355b4669Sjacobs 			addr->printer = strdup(printer->name);
390355b4669Sjacobs 		if (addr != NULL) {
391355b4669Sjacobs 			/*
392355b4669Sjacobs 			 * if the name given is not the same as that in the
393355b4669Sjacobs 			 * this is an alias/remote name so put that into the
394355b4669Sjacobs 			 * pname field otherwise duplicate the real printer
395355b4669Sjacobs 			 * name
396355b4669Sjacobs 			 */
397355b4669Sjacobs 			if (strcmp(name, printer->name) != 0) {
398355b4669Sjacobs 				addr->pname = strdup(name);
399355b4669Sjacobs 			} else {
400355b4669Sjacobs 				addr->pname = strdup(printer->name);
401355b4669Sjacobs 			}
402355b4669Sjacobs 		}
403355b4669Sjacobs 	}
404355b4669Sjacobs 
405355b4669Sjacobs 	return (addr);
406355b4669Sjacobs }
407355b4669Sjacobs 
408355b4669Sjacobs 
409355b4669Sjacobs /*
410355b4669Sjacobs  * FUNCTION:
411355b4669Sjacobs  *	ns_bsd_addr_t **ns_bsd_addr_get_list()
412355b4669Sjacobs  * OUTPUT:
413355b4669Sjacobs  *	ns_bsd_addr_t **(return) - a list of bsd addresses for all printers
414355b4669Sjacobs  *				   in all "name services"
415355b4669Sjacobs  * DESCRIPTION:
416355b4669Sjacobs  *	This function will gather a list of all printer addresses in all
417355b4669Sjacobs  *	of the "name services".  All redundancy is removed.
418355b4669Sjacobs  */
419355b4669Sjacobs ns_bsd_addr_t **
ns_bsd_addr_get_list(int unique)420355b4669Sjacobs ns_bsd_addr_get_list(int unique)
421355b4669Sjacobs {
422355b4669Sjacobs 	ns_printer_t **printers;
423355b4669Sjacobs 	ns_bsd_addr_t **list = NULL;
424355b4669Sjacobs 	char **aliases = NULL;
425355b4669Sjacobs 
426355b4669Sjacobs 	for (printers = ns_printer_get_list(NULL);
427355b4669Sjacobs 	    printers != NULL && *printers != NULL; printers++) {
428355b4669Sjacobs 		ns_bsd_addr_t *addr;
429355b4669Sjacobs 
430355b4669Sjacobs 		if (strcmp(NS_NAME_ALL, (*printers)->name) == 0)
431355b4669Sjacobs 			continue;
432355b4669Sjacobs 
433355b4669Sjacobs 		if ((addr = ns_get_value(NS_KEY_BSDADDR, *printers)) != NULL) {
434355b4669Sjacobs 			if (addr->printer == NULL)
435355b4669Sjacobs 				addr->printer = strdup((*printers)->name);
436355b4669Sjacobs 			addr->pname = strdup((*printers)->name);
437355b4669Sjacobs 		}
438355b4669Sjacobs 
439355b4669Sjacobs 		if (unique == UNIQUE)
440355b4669Sjacobs 			list =
441355b4669Sjacobs 			    (ns_bsd_addr_t **)list_append_unique((void **)list,
442355b4669Sjacobs 			    (void *)addr, (COMP_T)ns_bsd_addr_cmp);
443*f4593de7SToomas Soome 		else if (unique == LOCAL_UNIQUE)
444355b4669Sjacobs 			list =
445355b4669Sjacobs 			    (ns_bsd_addr_t **)list_append_unique((void **)list,
446355b4669Sjacobs 			    (void *)addr, (COMP_T)ns_bsd_addr_cmp_local);
447355b4669Sjacobs 		else
448355b4669Sjacobs 			list = (ns_bsd_addr_t **)list_append((void **)list,
449355b4669Sjacobs 			    (void *)addr);
450355b4669Sjacobs 
451355b4669Sjacobs 		for (aliases = (*printers)->aliases;
452*f4593de7SToomas Soome 		    (aliases != NULL) && (*aliases != NULL); aliases++) {
453355b4669Sjacobs 			/*
454355b4669Sjacobs 			 * Include any alias names that belong to the printer
455355b4669Sjacobs 			 */
456355b4669Sjacobs 
457355b4669Sjacobs 			if ((addr =
458*f4593de7SToomas Soome 			    ns_get_value(NS_KEY_BSDADDR, *printers)) != NULL) {
459*f4593de7SToomas Soome 				if (addr->printer == NULL) {
460355b4669Sjacobs 					addr->printer = strdup(*aliases);
461355b4669Sjacobs 				}
462355b4669Sjacobs 				addr->pname = strdup(*aliases);
463355b4669Sjacobs 			}
464355b4669Sjacobs 
465*f4593de7SToomas Soome 			if (unique == UNIQUE) {
466355b4669Sjacobs 				list = (ns_bsd_addr_t **)
467355b4669Sjacobs 				    list_append_unique((void **)list,
468355b4669Sjacobs 				    (void *)addr, (COMP_T)ns_bsd_addr_cmp);
469*f4593de7SToomas Soome 			} else if (unique == LOCAL_UNIQUE) {
470355b4669Sjacobs 				list = (ns_bsd_addr_t **)
471355b4669Sjacobs 				    list_append_unique((void **)list,
472355b4669Sjacobs 				    (void *)addr,
473355b4669Sjacobs 				    (COMP_T)ns_bsd_addr_cmp_local);
474*f4593de7SToomas Soome 			} else {
475355b4669Sjacobs 				list = (ns_bsd_addr_t **)
476355b4669Sjacobs 				    list_append((void **)list, (void *)addr);
477355b4669Sjacobs 			}
478355b4669Sjacobs 		}
479355b4669Sjacobs 	}
480355b4669Sjacobs 
481355b4669Sjacobs 	return (list);
482355b4669Sjacobs }
483355b4669Sjacobs 
484355b4669Sjacobs 
485355b4669Sjacobs 
486355b4669Sjacobs 
487355b4669Sjacobs /*
488355b4669Sjacobs  * FUNCTION:
489355b4669Sjacobs  *	ns_bsd_addr_t **ns_bsd_addr_get_list()
490355b4669Sjacobs  * OUTPUT:
491355b4669Sjacobs  *	ns_bsd_addr_t **(return) - a list of bsd addresses for "_all" printers
492355b4669Sjacobs  *				   in the "name service"
493355b4669Sjacobs  * DESCRIPTION:
494355b4669Sjacobs  *	This function will use the "_all" entry to find a list of printers and
495355b4669Sjacobs  *	addresses. The "default" printer is also added to the list.
496355b4669Sjacobs  *	All redundancy is removed.
497355b4669Sjacobs  */
498355b4669Sjacobs ns_bsd_addr_t **
ns_bsd_addr_get_all(int unique)499355b4669Sjacobs ns_bsd_addr_get_all(int unique)
500355b4669Sjacobs {
501355b4669Sjacobs 	ns_printer_t *printer;
502355b4669Sjacobs 	ns_bsd_addr_t **list = NULL;
503355b4669Sjacobs 	char **printers;
504355b4669Sjacobs 	char *def = NULL;
505355b4669Sjacobs 
506355b4669Sjacobs 	if (((def = (char *)getenv("PRINTER")) == NULL) &&
507355b4669Sjacobs 	    ((def = (char *)getenv("LPDEST")) == NULL))
508355b4669Sjacobs 		def = NS_NAME_DEFAULT;
509355b4669Sjacobs 
510355b4669Sjacobs 	list = (ns_bsd_addr_t **)list_append((void **)list,
511355b4669Sjacobs 	    (void *)ns_bsd_addr_get_name(def));
512355b4669Sjacobs 
513355b4669Sjacobs 	endprinterentry();
514355b4669Sjacobs 	if ((printer = ns_printer_get_name(NS_NAME_ALL, NULL)) == NULL)
515355b4669Sjacobs 		return (ns_bsd_addr_get_list(unique));
516355b4669Sjacobs 
517355b4669Sjacobs 	for (printers = (char **)ns_get_value(NS_KEY_ALL, printer);
518355b4669Sjacobs 	    printers != NULL && *printers != NULL; printers++) {
519355b4669Sjacobs 		ns_bsd_addr_t *addr;
520355b4669Sjacobs 
521355b4669Sjacobs 		addr = ns_bsd_addr_get_name(*printers);
522355b4669Sjacobs 		if (addr != NULL)
523355b4669Sjacobs 			addr->pname = *printers;
524355b4669Sjacobs 		if (unique == UNIQUE)
525355b4669Sjacobs 			list =
526355b4669Sjacobs 			    (ns_bsd_addr_t **)list_append_unique((void **)list,
527355b4669Sjacobs 			    (void *)addr, (COMP_T)ns_bsd_addr_cmp);
528355b4669Sjacobs 		else
529355b4669Sjacobs 			list = (ns_bsd_addr_t **)list_append((void **)list,
530355b4669Sjacobs 			    (void *)addr);
531355b4669Sjacobs 	}
532355b4669Sjacobs 
533355b4669Sjacobs 	return (list);
534355b4669Sjacobs }
535355b4669Sjacobs 
536355b4669Sjacobs ns_bsd_addr_t *
ns_bsd_addr_get_default()537355b4669Sjacobs ns_bsd_addr_get_default()
538355b4669Sjacobs {
539355b4669Sjacobs 	char *def = NULL;
540355b4669Sjacobs 	ns_bsd_addr_t *addr;
541355b4669Sjacobs 
542355b4669Sjacobs 	if (((def = (char *)getenv("PRINTER")) == NULL) &&
543355b4669Sjacobs 	    ((def = (char *)getenv("LPDEST")) == NULL)) {
544355b4669Sjacobs 		def = NS_NAME_DEFAULT;
545355b4669Sjacobs 		addr = ns_bsd_addr_get_name(def);
546355b4669Sjacobs 		if (addr != NULL) {
547355b4669Sjacobs 			addr->pname = def;
548355b4669Sjacobs 			return (addr);
549355b4669Sjacobs 		}
550355b4669Sjacobs 	}
551355b4669Sjacobs 
552355b4669Sjacobs 	return (NULL);
553355b4669Sjacobs }
554