12264Sjacobs /* 22264Sjacobs * CDDL HEADER START 32264Sjacobs * 42264Sjacobs * The contents of this file are subject to the terms of the 52264Sjacobs * Common Development and Distribution License (the "License"). 62264Sjacobs * You may not use this file except in compliance with the License. 72264Sjacobs * 82264Sjacobs * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 92264Sjacobs * or http://www.opensolaris.org/os/licensing. 102264Sjacobs * See the License for the specific language governing permissions 112264Sjacobs * and limitations under the License. 122264Sjacobs * 132264Sjacobs * When distributing Covered Code, include this CDDL HEADER in each 142264Sjacobs * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 152264Sjacobs * If applicable, add the following below this CDDL HEADER, with the 162264Sjacobs * fields enclosed by brackets "[]" replaced with your own identifying 172264Sjacobs * information: Portions Copyright [yyyy] [name of copyright owner] 182264Sjacobs * 192264Sjacobs * CDDL HEADER END 202264Sjacobs */ 212264Sjacobs 222264Sjacobs /* 23*12224SGowtham.Thommandra@Sun.COM * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. 242264Sjacobs * 252264Sjacobs */ 262264Sjacobs 272409Sjacobs /* Id: nss.c 180 2006-07-20 17:33:02Z njacobs $ */ 282264Sjacobs 292264Sjacobs #include <stdio.h> 302264Sjacobs #include <stdlib.h> 312264Sjacobs #include <unistd.h> 322264Sjacobs #include <string.h> 332264Sjacobs #include <ctype.h> 342264Sjacobs #include <sys/types.h> 352264Sjacobs #include <syslog.h> 362264Sjacobs #include <papi.h> 372264Sjacobs #include <uri.h> 382264Sjacobs #include <papi_impl.h> 392264Sjacobs #ifdef NSS_EMULATION 402264Sjacobs #include <nss-emulation.h> 412264Sjacobs #elif NSS_SOLARIS 422264Sjacobs #include <nss_dbdefs.h> 432264Sjacobs #endif 442264Sjacobs #include <config-site.h> 452264Sjacobs #if defined(__sun) && defined(__SVR4) 462264Sjacobs #include <sys/systeminfo.h> 472264Sjacobs #endif 482264Sjacobs 492264Sjacobs 502264Sjacobs static char * 512409Sjacobs bsdaddr_to_uri(papi_attribute_t **list, char *bsdaddr) 522264Sjacobs { 532264Sjacobs char *result = NULL; 542264Sjacobs 552264Sjacobs if (bsdaddr != NULL) { 562264Sjacobs char *bsd[3], *tmp, *iter = NULL; 572264Sjacobs char buf[512]; 582264Sjacobs 592264Sjacobs tmp = strdup(bsdaddr); 602264Sjacobs 612264Sjacobs bsd[0] = strtok_r(tmp, ":,", &iter); 622409Sjacobs if ((bsd[1] = strtok_r(NULL, ":,", &iter)) == NULL) 632409Sjacobs papiAttributeListGetString(list, NULL, 64*12224SGowtham.Thommandra@Sun.COM "printer-name", &bsd[1]); 652264Sjacobs bsd[2] = strtok_r(NULL, ":,", &iter); 662264Sjacobs 672409Sjacobs snprintf(buf, sizeof (buf), "lpd://%s/printers/%s%s%s", bsd[0], 68*12224SGowtham.Thommandra@Sun.COM (bsd[1] != NULL) ? bsd[1] : "", 69*12224SGowtham.Thommandra@Sun.COM (bsd[2] != NULL) ? "#" : "", 70*12224SGowtham.Thommandra@Sun.COM (bsd[2] != NULL) ? bsd[2] : ""); 712264Sjacobs 722264Sjacobs free(tmp); 732264Sjacobs 742264Sjacobs result = strdup(buf); 752264Sjacobs } 762264Sjacobs 772264Sjacobs return (result); 782264Sjacobs } 792264Sjacobs 802264Sjacobs #if defined(__sun) && defined(__SVR4) 812264Sjacobs /* 822264Sjacobs * This is an awful HACK to force the dynamic PAPI library to use the 832264Sjacobs * lpsched support when the destination apears to be a local lpsched 842264Sjacobs * queue on Solaris. 852264Sjacobs */ 862264Sjacobs static void 872264Sjacobs solaris_lpsched_shortcircuit_hack(papi_attribute_t ***list) 882264Sjacobs { 892264Sjacobs papi_attribute_t *attribute; 902264Sjacobs uri_t *uri = NULL; 912264Sjacobs char *printer = NULL; 922264Sjacobs char buf[128], buf2[128]; 932264Sjacobs 942264Sjacobs /* setting this in the calling env can be useful for debugging */ 952264Sjacobs if (getenv("DISABLE_LPSCHED_SHORTCIRCUIT") != NULL) 962264Sjacobs return; 972264Sjacobs 982264Sjacobs papiAttributeListGetString(*list, NULL, 99*12224SGowtham.Thommandra@Sun.COM "printer-uri-supported", &printer); 1007253Sjacobs /* if there is no printer-uri-supported, there is nothing to do */ 1017322SWendy.Phillips@Sun.COM if (printer == NULL) { 1022264Sjacobs return; 1037322SWendy.Phillips@Sun.COM } 1042264Sjacobs 1057253Sjacobs if (uri_from_string(printer, &uri) < 0) { 1067253Sjacobs papiAttributeListFree(*list); 1077253Sjacobs *list = NULL; 1087322SWendy.Phillips@Sun.COM uri_free(uri); 1097253Sjacobs return; 1107253Sjacobs } 1117253Sjacobs 1122264Sjacobs /* already an lpsched URI ? */ 1137322SWendy.Phillips@Sun.COM if (strcasecmp(uri->scheme, "lpsched") == 0) { 1147322SWendy.Phillips@Sun.COM uri_free(uri); 1152264Sjacobs return; 1167322SWendy.Phillips@Sun.COM } 1172264Sjacobs 1189411SKeerthi.Kondaka@Sun.COM if (uri->path == NULL) { 1199411SKeerthi.Kondaka@Sun.COM printer = ""; 1209411SKeerthi.Kondaka@Sun.COM } else { 1219411SKeerthi.Kondaka@Sun.COM if ((printer = strrchr(uri->path, '/')) == NULL) 1229411SKeerthi.Kondaka@Sun.COM printer = uri->path; 1239411SKeerthi.Kondaka@Sun.COM else 1249411SKeerthi.Kondaka@Sun.COM printer++; 1259411SKeerthi.Kondaka@Sun.COM } 1262264Sjacobs 1272264Sjacobs /* is there an lpsched queue (printer/class) */ 1282264Sjacobs snprintf(buf, sizeof (buf), "/etc/lp/interfaces/%s", printer); 1292264Sjacobs snprintf(buf2, sizeof (buf2), "/etc/lp/classes/%s", printer); 1307322SWendy.Phillips@Sun.COM if ((access(buf, F_OK) < 0) && (access(buf2, F_OK) < 0)) { 1317322SWendy.Phillips@Sun.COM uri_free(uri); 1322264Sjacobs return; 1337322SWendy.Phillips@Sun.COM } 1342264Sjacobs 1352313Sjacobs /* is this the "local" host */ 1367322SWendy.Phillips@Sun.COM if ((uri->host != NULL) && (is_localhost(uri->host) == 0)) { 1377322SWendy.Phillips@Sun.COM uri_free(uri); 1382313Sjacobs return; 1397322SWendy.Phillips@Sun.COM } 1402313Sjacobs 1412313Sjacobs snprintf(buf, sizeof (buf), "lpsched://%s/printers/%s", 142*12224SGowtham.Thommandra@Sun.COM (uri->host ? uri->host : "localhost"), printer); 1432264Sjacobs papiAttributeListAddString(list, PAPI_ATTR_REPLACE, 144*12224SGowtham.Thommandra@Sun.COM "printer-uri-supported", buf); 1457322SWendy.Phillips@Sun.COM uri_free(uri); 1462264Sjacobs } 1472264Sjacobs #endif 1482264Sjacobs 1492264Sjacobs static void 1502264Sjacobs fill_printer_uri_supported(papi_attribute_t ***list) 1512264Sjacobs { 1522264Sjacobs papi_attribute_t *attribute; 1532264Sjacobs char *string = NULL; 1542264Sjacobs 1552264Sjacobs /* do we have a printer-uri-supported */ 1562264Sjacobs attribute = papiAttributeListFind(*list, "printer-uri-supported"); 1572264Sjacobs if (attribute != NULL) /* we have what we need, return */ 1582264Sjacobs return; 1592264Sjacobs 1606817Sjacobs /* do we have a printer-uri (in URI form) to rename */ 1612264Sjacobs attribute = papiAttributeListFind(*list, "printer-uri"); 1626817Sjacobs if ((attribute != NULL) && 1636817Sjacobs (attribute->type == PAPI_STRING) && 1646817Sjacobs (attribute->values != NULL) && 1656817Sjacobs (attribute->values[0]->string != NULL) && 1666817Sjacobs (strstr(attribute->values[0]->string, "://") != NULL)) { 1676817Sjacobs /* rename it in place and return */ 1682264Sjacobs free(attribute->name); 1692264Sjacobs attribute->name = strdup("printer-uri-supported"); 1702264Sjacobs return; 1712264Sjacobs } 1722264Sjacobs 1732264Sjacobs /* do we have a printers.conf(4) "bsdaddr" to convert */ 1742264Sjacobs papiAttributeListGetString(*list, NULL, "bsdaddr", &string); 1752264Sjacobs if (string != NULL) { /* parse it, convert it, add it */ 1762409Sjacobs char *uri = bsdaddr_to_uri(*list, string); 1772264Sjacobs 1782264Sjacobs if (uri != NULL) { 1792264Sjacobs papiAttributeListAddString(list, PAPI_ATTR_APPEND, 180*12224SGowtham.Thommandra@Sun.COM "printer-uri-supported", uri); 1812264Sjacobs papiAttributeListDelete(list, "bsdaddr"); 1822264Sjacobs free(uri); 1832264Sjacobs return; 1842264Sjacobs } 1852264Sjacobs } 1862264Sjacobs 1872264Sjacobs /* do we have a printers.conf(4) "rm" (and "rp") to convert */ 1882264Sjacobs papiAttributeListGetString(*list, NULL, "rm", &string); 1892264Sjacobs if (string != NULL) { 1902264Sjacobs char *rp = NULL; 1912264Sjacobs 1922264Sjacobs /* default to "printer-name", but use "rp" if we have it */ 1932264Sjacobs papiAttributeListGetString(*list, NULL, "printer-name", &rp); 1942264Sjacobs papiAttributeListGetString(*list, NULL, "rp", &rp); 1952264Sjacobs 1962264Sjacobs if (rp != NULL) { /* fill in the uri if we have the data */ 1972264Sjacobs char buf[BUFSIZ]; 1982264Sjacobs 1992264Sjacobs snprintf(buf, sizeof (buf), "lpd://%s/printers/%s", 200*12224SGowtham.Thommandra@Sun.COM string, rp); 2012264Sjacobs papiAttributeListAddString(list, PAPI_ATTR_APPEND, 202*12224SGowtham.Thommandra@Sun.COM "printer-uri-supported", strdup(buf)); 2032264Sjacobs return; 2042264Sjacobs } 2052264Sjacobs } 2062264Sjacobs 2072264Sjacobs /* if were are here, we don't have a printer-uri-supported */ 2082264Sjacobs } 2092264Sjacobs 2102264Sjacobs #ifdef NEED_BROKEN_PRINTER_URI_SEMANTIC 2112264Sjacobs static void 2122264Sjacobs fill_printer_uri(papi_attribute_t ***list) 2132264Sjacobs { 2142264Sjacobs papi_attribute_t *attribute; 2152264Sjacobs char *uri = NULL; 2162264Sjacobs 2172264Sjacobs if ((list == NULL) || (*list == NULL)) 2182264Sjacobs return; 2192264Sjacobs 2202313Sjacobs /* do we have a printer-uri */ 2212264Sjacobs attribute = papiAttributeListFind(*list, "printer-uri"); 2222264Sjacobs if (attribute != NULL) /* we have what we need, return */ 2232264Sjacobs return; 2242264Sjacobs 2252264Sjacobs /* 2262264Sjacobs * this is sufficient to fool libgnomeprintpapi, but not promote it's 2272264Sjacobs * use in the future. 2282264Sjacobs */ 2292264Sjacobs papiAttributeListAddString(list, PAPI_ATTR_EXCL, "printer-uri", 230*12224SGowtham.Thommandra@Sun.COM "broken printer-uri semantic"); 2312264Sjacobs } 2322264Sjacobs #endif /* NEED_BROKEN_PRINTER_URI_SEMANTIC */ 2332264Sjacobs 2342264Sjacobs static void 2352264Sjacobs cvt_all_to_member_names(papi_attribute_t ***list) 2362264Sjacobs { 2372264Sjacobs papi_status_t status; 2382264Sjacobs void *iter = NULL; 2392264Sjacobs char *string = NULL; 2402264Sjacobs 2412264Sjacobs papiAttributeListGetString(*list, NULL, "member-names", &string); 2422264Sjacobs if (string != NULL) /* already have a member-names */ 2432264Sjacobs return; 2442264Sjacobs 2452264Sjacobs for (status = papiAttributeListGetString(*list, &iter, "all", &string); 2467322SWendy.Phillips@Sun.COM status == PAPI_OK; 2477322SWendy.Phillips@Sun.COM status = papiAttributeListGetString(*list, &iter, NULL, &string)) { 2482264Sjacobs char *s_iter = NULL, *value, *tmp = strdup(string); 2492264Sjacobs 2502264Sjacobs for (value = strtok_r(tmp, ", \t", &s_iter); 2517322SWendy.Phillips@Sun.COM value != NULL; 2527322SWendy.Phillips@Sun.COM value = strtok_r(NULL, ", \t", &s_iter)) 2532264Sjacobs papiAttributeListAddString(list, PAPI_ATTR_APPEND, 254*12224SGowtham.Thommandra@Sun.COM "member-names", value); 2552264Sjacobs free(tmp); 2562264Sjacobs } 2572264Sjacobs } 2582264Sjacobs 2592264Sjacobs static papi_attribute_t ** 2602264Sjacobs _cvt_nss_entry_to_printer(char *entry) 2612264Sjacobs { 262*12224SGowtham.Thommandra@Sun.COM char *key = NULL; 263*12224SGowtham.Thommandra@Sun.COM char *cp; 264*12224SGowtham.Thommandra@Sun.COM char buf[BUFSIZ]; 2652264Sjacobs int in_namelist = 1, buf_pos = 0; 2662264Sjacobs papi_attribute_t **list = NULL; 2672264Sjacobs 2682264Sjacobs if (entry == NULL) 2692264Sjacobs return (NULL); 2702264Sjacobs 2712264Sjacobs memset(buf, 0, sizeof (buf)); 2722264Sjacobs for (cp = entry; *cp != '\0'; cp++) { 2732264Sjacobs switch (*cp) { 2742264Sjacobs case ':': /* end of kvp */ 2752264Sjacobs if (in_namelist != 0) { 2762264Sjacobs papiAttributeListAddString(&list, 277*12224SGowtham.Thommandra@Sun.COM PAPI_ATTR_APPEND, "printer-name", buf); 2782264Sjacobs in_namelist = 0; 2797322SWendy.Phillips@Sun.COM } else if (key != NULL) { 2802264Sjacobs papiAttributeListAddString(&list, 281*12224SGowtham.Thommandra@Sun.COM PAPI_ATTR_APPEND, key, buf); 2827322SWendy.Phillips@Sun.COM free(key); 2837322SWendy.Phillips@Sun.COM } 2842264Sjacobs memset(buf, 0, sizeof (buf)); 2852264Sjacobs buf_pos = 0; 2862264Sjacobs key = NULL; 2872264Sjacobs break; 2882264Sjacobs case '=': /* kvp seperator */ 2892264Sjacobs if (key == NULL) { 2902264Sjacobs key = strdup(buf); 2912264Sjacobs memset(buf, 0, sizeof (buf)); 2922264Sjacobs buf_pos = 0; 2932264Sjacobs } else 2942264Sjacobs buf[buf_pos++] = *cp; 2952264Sjacobs break; 2962264Sjacobs case '|': /* namelist seperator */ 2972264Sjacobs if (in_namelist != 0) { 2982264Sjacobs papiAttributeListAddString(&list, 299*12224SGowtham.Thommandra@Sun.COM PAPI_ATTR_APPEND, "printer-name", buf); 3002264Sjacobs memset(buf, 0, sizeof (buf)); 3012264Sjacobs buf_pos = 0; 3022264Sjacobs } else /* add it to the buffer */ 3032264Sjacobs buf[buf_pos++] = *cp; 3042264Sjacobs break; 3052264Sjacobs case '\\': /* escape char */ 3062264Sjacobs buf[buf_pos++] = *(++cp); 3072264Sjacobs break; 3082264Sjacobs default: 3092264Sjacobs buf[buf_pos++] = *cp; 3102264Sjacobs } 3112264Sjacobs 3122264Sjacobs } 3132264Sjacobs 3147322SWendy.Phillips@Sun.COM if (key != NULL) { 3152264Sjacobs papiAttributeListAddString(&list, PAPI_ATTR_APPEND, key, buf); 3167322SWendy.Phillips@Sun.COM free(key); 3177322SWendy.Phillips@Sun.COM } 3182264Sjacobs 3192264Sjacobs /* resolve any "use" references in the configuration DB */ 3202264Sjacobs key = NULL; 3212264Sjacobs papiAttributeListGetString(list, NULL, "use", &key); 3222264Sjacobs if (key != NULL) { 3232264Sjacobs papi_attribute_t **use_attrs = getprinterbyname(key, NULL); 3242264Sjacobs 3252264Sjacobs list_concatenate(&list, use_attrs); 3262264Sjacobs } 3272264Sjacobs 3282264Sjacobs fill_printer_uri_supported(&list); 3292264Sjacobs cvt_all_to_member_names(&list); /* convert "all" to "member-names" */ 3302264Sjacobs 3312264Sjacobs return (list); 3322264Sjacobs } 3332264Sjacobs 3342264Sjacobs #if defined(NSS_SOLARIS) && !defined(NSS_EMULATION) 3352264Sjacobs 3362264Sjacobs #ifndef NSS_DBNAM__PRINTERS /* not in nss_dbdefs.h because it's private */ 3372264Sjacobs #define NSS_DBNAM__PRINTERS "_printers" 3382264Sjacobs #endif 3392264Sjacobs 3402264Sjacobs static DEFINE_NSS_DB_ROOT(db_root); 3412264Sjacobs static DEFINE_NSS_GETENT(context); 3422264Sjacobs 3432264Sjacobs static char *private_ns = NULL; 3442264Sjacobs 3452264Sjacobs static void 3462264Sjacobs _nss_initf_printers(p) 3472264Sjacobs nss_db_params_t *p; 3482264Sjacobs { 3492264Sjacobs if (private_ns != NULL) { 3502264Sjacobs /* 3512264Sjacobs * because we need to support a legacy interface that allows 3522264Sjacobs * us to select a specific name service, we need to dummy up 3532264Sjacobs * the parameters to use a private nsswitch database and set 3542264Sjacobs * the * default_config entry to the name service we are 3552264Sjacobs * looking into. 3562264Sjacobs */ 3572264Sjacobs p->name = NSS_DBNAM__PRINTERS; /* "_printers" */ 3582264Sjacobs p->default_config = private_ns; 3592847Sjacobs } else { 3602264Sjacobs /* regular behaviour */ 3612264Sjacobs p->name = NSS_DBNAM_PRINTERS; /* "printers" */ 3622264Sjacobs p->default_config = NSS_DEFCONF_PRINTERS; 3632264Sjacobs } 3642847Sjacobs syslog(LOG_DEBUG, "database: %s, default: %s", 3652264Sjacobs (p->name ? p->name : "NULL"), 3662264Sjacobs (p->default_config ? p->default_config : "NULL")); 3672264Sjacobs } 3682264Sjacobs 3692264Sjacobs /* 3702264Sjacobs * Return values: 0 = success, 1 = parse error, 2 = erange ... 3712264Sjacobs * The structure pointer passed in is a structure in the caller's space 3722264Sjacobs * wherein the field pointers would be set to areas in the buffer if 3732264Sjacobs * need be. instring and buffer should be separate areas. 3742264Sjacobs */ 3752264Sjacobs /* ARGSUSED */ 3762264Sjacobs static int 3772264Sjacobs str2printer(const char *instr, int lenstr, void *ent, char *buffer, int buflen) 3782264Sjacobs { 3792264Sjacobs if (lenstr + 1 > buflen) 3802264Sjacobs return (NSS_STR_PARSE_ERANGE); 3812571Sjacobs 3822571Sjacobs /* skip entries that begin with '#' */ 3832571Sjacobs if (instr[0] == '#') 3842571Sjacobs return (NSS_STR_PARSE_PARSE); 3852571Sjacobs 3862264Sjacobs /* 3872264Sjacobs * We copy the input string into the output buffer 3882264Sjacobs */ 3892264Sjacobs (void) memcpy(buffer, instr, lenstr); 3902264Sjacobs buffer[lenstr] = '\0'; 3912264Sjacobs 3922264Sjacobs return (NSS_STR_PARSE_SUCCESS); 3932264Sjacobs } 3942264Sjacobs #endif /* NSS_SOLARIS */ 3952264Sjacobs 3962264Sjacobs int 3972264Sjacobs setprinterentry(int stayopen, char *ns) 3982264Sjacobs { 3992264Sjacobs #ifdef NSS_EMULATION 4002264Sjacobs emul_setprinterentry(stayopen); 4012264Sjacobs #elif NSS_SOLARIS 4022264Sjacobs private_ns = ns; 4032264Sjacobs nss_setent(&db_root, _nss_initf_printers, &context); 4042847Sjacobs private_ns = NULL; 4052264Sjacobs #endif 4062264Sjacobs return (0); 4072264Sjacobs } 4082264Sjacobs 4092264Sjacobs 4102264Sjacobs int 4112264Sjacobs endprinterentry(int i) 4122264Sjacobs { 4132264Sjacobs #ifdef NSS_EMULATION 4142264Sjacobs emul_endprinterentry(); 4152264Sjacobs #elif NSS_SOLARIS 4162264Sjacobs nss_endent(&db_root, _nss_initf_printers, &context); 4172264Sjacobs nss_delete(&db_root); 4182847Sjacobs private_ns = NULL; 4192264Sjacobs #endif 4202264Sjacobs return (0); 4212264Sjacobs } 4222264Sjacobs 4232264Sjacobs /* ARGSUSED2 */ 4242264Sjacobs papi_attribute_t ** 4252264Sjacobs getprinterentry(char *ns) 4262264Sjacobs { 4272264Sjacobs papi_attribute_t **result = NULL; 4282264Sjacobs 4292264Sjacobs #if defined(NSS_EMULATION) || defined(NSS_SOLARIS) 4302264Sjacobs char buf[10240]; 4312264Sjacobs nss_status_t res = NSS_NOTFOUND; 4322264Sjacobs 4332264Sjacobs #ifdef NSS_EMULATION 4342264Sjacobs res = emul_getprinterentry_r(buf, sizeof (buf)); 4352264Sjacobs #elif NSS_SOLARIS 4362264Sjacobs nss_XbyY_args_t arg; 4372264Sjacobs 4382847Sjacobs private_ns = ns; 439*12224SGowtham.Thommandra@Sun.COM buf[0] = '\0'; 4402264Sjacobs NSS_XbyY_INIT(&arg, buf, buf, sizeof (buf), str2printer); 4412264Sjacobs res = nss_getent(&db_root, _nss_initf_printers, &context, &arg); 4422264Sjacobs (void) NSS_XbyY_FINI(&arg); 4432847Sjacobs private_ns = NULL; 4442264Sjacobs #endif 4452264Sjacobs 4462264Sjacobs if (res != NSS_SUCCESS) 4472264Sjacobs buf[0] = '\0'; 4482264Sjacobs 4492264Sjacobs result = _cvt_nss_entry_to_printer(buf); 4502313Sjacobs #if defined(__sun) && defined(__SVR4) 4512313Sjacobs solaris_lpsched_shortcircuit_hack(&result); 4522313Sjacobs #endif 4532264Sjacobs #ifdef NEED_BROKEN_PRINTER_URI_SEMANTIC 4542264Sjacobs fill_printer_uri(&result); 4552264Sjacobs #endif /* NEED_BROKEN_PRINTER_URI_SEMANTIC */ 4562264Sjacobs #endif 4572264Sjacobs 4582264Sjacobs #ifdef DEBUG 4592264Sjacobs printf("getprinterentry(%s): 0x%8.8x\n", (ns ? ns : "NULL"), result); 4602264Sjacobs if (result != NULL) { 4612264Sjacobs char buf[4096]; 4622264Sjacobs 4632264Sjacobs papiAttributeListToString(result, "\n\t", buf, sizeof (buf)); 4642264Sjacobs printf("\t%s\n", buf); 4652264Sjacobs } 4662264Sjacobs #endif /* DEBUG */ 4672264Sjacobs 4682264Sjacobs return (result); 4692264Sjacobs } 4702264Sjacobs 4712264Sjacobs 4722264Sjacobs papi_attribute_t ** 4732264Sjacobs getprinterbyname(char *name, char *ns) 4742264Sjacobs { 4752264Sjacobs papi_attribute_t **result = NULL; 4762264Sjacobs 4772264Sjacobs if (strstr(name, "://") != NULL) { /* shortcut for URI form */ 4782264Sjacobs papiAttributeListAddString(&result, PAPI_ATTR_APPEND, 479*12224SGowtham.Thommandra@Sun.COM "printer-name", name); 4802264Sjacobs papiAttributeListAddString(&result, PAPI_ATTR_APPEND, 481*12224SGowtham.Thommandra@Sun.COM "printer-uri-supported", name); 4822264Sjacobs } else if (strchr(name, ':') != NULL) { /* shortcut for POSIX form */ 4832409Sjacobs char *uri = bsdaddr_to_uri(result, name); 4842264Sjacobs 4852264Sjacobs papiAttributeListAddString(&result, PAPI_ATTR_APPEND, 486*12224SGowtham.Thommandra@Sun.COM "printer-name", name); 4872264Sjacobs if (uri != NULL) { 4882264Sjacobs papiAttributeListAddString(&result, PAPI_ATTR_APPEND, 489*12224SGowtham.Thommandra@Sun.COM "printer-uri-supported", uri); 4902264Sjacobs free(uri); 4912264Sjacobs } 4922264Sjacobs } else { /* anything else */ 4932264Sjacobs #if defined(NSS_EMULATION) || defined(NSS_SOLARIS) 4942264Sjacobs char buf[10240]; 4952264Sjacobs nss_status_t res = NSS_NOTFOUND; 4962264Sjacobs 4972264Sjacobs #ifdef NSS_EMULATION 4982264Sjacobs res = emul_getprinterbyname_r(name, buf, sizeof (buf)); 4992264Sjacobs #elif NSS_SOLARIS 5002264Sjacobs nss_XbyY_args_t arg; 5012264Sjacobs 5022264Sjacobs private_ns = ns; 5032264Sjacobs NSS_XbyY_INIT(&arg, buf, buf, sizeof (buf), str2printer); 5042264Sjacobs arg.key.name = name; 5052264Sjacobs res = nss_search(&db_root, _nss_initf_printers, 506*12224SGowtham.Thommandra@Sun.COM NSS_DBOP_PRINTERS_BYNAME, &arg); 5072264Sjacobs (void) NSS_XbyY_FINI(&arg); 5082847Sjacobs private_ns = NULL; 5092264Sjacobs 5102264Sjacobs if (res != NSS_SUCCESS) 5112264Sjacobs buf[0] = '\0'; 5122264Sjacobs #endif 5132264Sjacobs 5142264Sjacobs result = _cvt_nss_entry_to_printer(buf); 5152264Sjacobs #endif 5162264Sjacobs } 5172313Sjacobs #if defined(__sun) && defined(__SVR4) 5182313Sjacobs solaris_lpsched_shortcircuit_hack(&result); 5192313Sjacobs #endif 5202264Sjacobs #ifdef DEBUG 5212264Sjacobs printf("getprinterbyname(%s): %s = 0x%8.8x\n", (ns ? ns : "NULL"), 522*12224SGowtham.Thommandra@Sun.COM name, result); 5232264Sjacobs if (result != NULL) { 5242264Sjacobs char buf[4096]; 5252264Sjacobs 5262264Sjacobs papiAttributeListToString(result, "\n\t", buf, sizeof (buf)); 5272264Sjacobs printf("\t%s\n", buf); 5282264Sjacobs } 5292264Sjacobs #endif /* DEBUG */ 5302264Sjacobs 5312264Sjacobs return (result); 5322264Sjacobs } 533