/* * main() calls the appropriate routine to parse the command line arguments * and then calls the local remove routine, followed by the remote remove * routine to remove jobs. */ int main(int ac, char *av[]) { char *program; int c; char **keys = NULL; char *ns = NULL; int exit_code = 0; (void) setlocale(LC_ALL, ""); #if !defined(TEXT_DOMAIN) #define TEXT_DOMAIN "SYS_TEST" #endif (void) textdomain(TEXT_DOMAIN); if ((program = strrchr(av[0], '/')) == NULL) program = av[0]; else program++; openlog(program, LOG_PID, LOG_LPR); while ((c = getopt(ac, av, "k:t:n:")) != EOF) switch (c) { case 'k': case 't': keys = (char **)list_append((void **)keys, (void *)optarg); break; case 'n': ns = optarg; break; default: Usage(program); } if (optind >= ac) Usage(program); ns = normalize_ns_name(ns); while (optind < ac) { char *name = av[optind++]; if (strcmp(name, "list") == 0) { ns_printer_t **printers = ns_printer_get_list(ns); while (printers != NULL && *printers != NULL) { exit_code += display_value(*printers, (*printers)->name, keys); printers++; } } else exit_code = display_value(ns_printer_get_name(name, ns), name, keys); } return (exit_code); }
/* * FUNCTION: * ns_r_get_value(const char *key, const ns_printer_t *printer) * INPUT(S): * const char *key * - key for matching * const ns_printer_t *printer * - printer to glean this from * OUTPUT(S): * char * (return value) * - NULL, if not matched * DESCRIPTION: */ static void * ns_r_get_value(const char *key, const ns_printer_t *printer, int level) { ns_kvp_t *kvp, **attrs; if ((key == NULL) || (printer == NULL) || (printer->attributes == NULL)) return (NULL); if (level++ == 16) return (NULL); /* find it right here */ if ((kvp = list_locate((void **)printer->attributes, (COMP_T)ns_kvp_match_key, (void *)key)) != NULL) { void *value = string_to_value(key, kvp->value); /* fill in an empty printer for a bsdaddr */ if (strcmp(key, NS_KEY_BSDADDR) == 0) { ns_bsd_addr_t *addr = value; if (addr->printer == NULL) addr->printer = strdup(printer->name); } return (value); } /* find it in a child */ for (attrs = printer->attributes; attrs != NULL && *attrs != NULL; attrs++) { void *value = NULL; if ((strcmp((*attrs)->key, NS_KEY_ALL) == 0) || (strcmp((*attrs)->key, NS_KEY_GROUP) == 0)) { char **printers; for (printers = string_to_value((*attrs)->key, (*attrs)->value); printers != NULL && *printers != NULL; printers++) { ns_printer_t *printer = ns_printer_get_name(*printers, NULL); if ((value = ns_r_get_value(key, printer, level)) != NULL) return (value); ns_printer_destroy(printer); } } else if (strcmp((*attrs)->key, NS_KEY_LIST) == 0) { ns_printer_t **printers; for (printers = string_to_value((*attrs)->key, (*attrs)->value); printers != NULL && *printers != NULL; printers++) { if ((value = ns_r_get_value(key, *printers, level)) != NULL) return (value); } } else if (strcmp((*attrs)->key, NS_KEY_USE) == 0) { char *string = NULL; ns_printer_t *printer = ns_printer_get_name((*attrs)->value, NULL); if ((value = ns_r_get_value(key, printer, level)) != NULL) string = value_to_string(string, value); if (string != NULL) value = string_to_value(key, string); ns_printer_destroy(printer); } if (value != NULL) return (value); } return (NULL); }
int _updateldap( const char *action, const char *host, const char *binddn, const char *passwd, const char *printername, const char *printserver, const char *extensions, const char *comment, const char *isdefault) { ns_printer_t *printer; ns_bsd_addr_t *addr; ns_cred_t *cred; char *item = NULL; char **attrList = NULL; int status; if (printserver == NULL) { /* printserver not given so use host */ printserver = host; } cred = (ns_cred_t *)malloc(sizeof (*cred)); (void) memset(cred, '\0', sizeof (*cred)); cred->passwd = strdup((char *)passwd); cred->binddn = strdup((char *)binddn); cred->host = strdup((char *)host); cred->passwdType = NS_PW_INSECURE; /* use default */ cred->port = 0; /* use default */ cred->domainDN = NULL; /* use default */ if (strcmp(action, "delete") == 0) { /* * Delete printer object from LDAP directory DIT */ if ((printer = (ns_printer_t *) ns_printer_get_name(printername, "ldap")) == NULL) { return (0); } printer->attributes = NULL; printer->nsdata = malloc(sizeof (NS_LDAPDATA)); if (printer->nsdata == NULL) { return (1); } ((NS_LDAPDATA *)(printer->nsdata))->attrList = NULL; printer->cred = cred; printer->source = strdup("ldap"); status = ns_printer_put(printer); free(printer->nsdata); (void) ns_printer_destroy(printer); if (status != 0) { return (status); } if ((printer = (ns_printer_t *) ns_printer_get_name("_default", "ldap")) != NULL) { char *dflt = (char *) ns_get_value_string("use", printer); if ((dflt != NULL) && (strcmp(dflt, printername) == 0)) { printer->attributes = NULL; printer->nsdata = malloc(sizeof (NS_LDAPDATA)); if (printer->nsdata == NULL) { (void) ns_printer_destroy(printer); return (1); } ((NS_LDAPDATA *)(printer->nsdata))->attrList = NULL; printer->cred = cred; printer->source = strdup("ldap"); status = ns_printer_put(printer); free(printer->nsdata); if (status != 0) { (void) ns_printer_destroy(printer); return (status); } } (void) ns_printer_destroy(printer); } return (0); } else if (strcmp(action, "add") == 0) { /* * Add new printer object into LDAP directory DIT */ printer = (ns_printer_t *)malloc(sizeof (*printer)); if (printer == NULL) { return (1); } (void) memset(printer, 0, sizeof (*printer)); printer->name = strdup((char *)printername); printer->source = strdup("ldap"); printer->cred = cred; /* set BSD address in attribute list */ if (extensions == NULL) { item = (char *)malloc(strlen("bsdaddr") + strlen(printserver) + strlen(printername) + strlen("Solaris") + 6); } else { item = (char *)malloc(strlen("bsdaddr") + strlen(printserver) + strlen(printername) + strlen(extensions) + 6); } if (item == NULL) { (void) ns_printer_destroy(printer); return (1); } if (extensions == NULL) { sprintf(item, "%s=%s,%s,%s", "bsdaddr", printserver, printername, "Solaris"); } else { sprintf(item, "%s=%s,%s,%s", "bsdaddr", printserver, printername, extensions); } attrList = (char **)list_append((void**)attrList, (void *)item); if ((comment != NULL) && (strlen(comment) > 0)) { item = (char *)malloc(strlen("description") + strlen(comment) + 4); if (item == NULL) { (void) ns_printer_destroy(printer); return (1); } sprintf(item, "%s=%s", "description", comment); attrList = (char **)list_append((void**)attrList, (void *)item); } printer->attributes = NULL; printer->nsdata = malloc(sizeof (NS_LDAPDATA) + 2); if (printer->nsdata == NULL) { (void) ns_printer_destroy(printer); return (1); } ((NS_LDAPDATA *)(printer->nsdata))->attrList = attrList; status = ns_printer_put(printer); _freeList(&attrList); if (status != 0) { free(printer->nsdata); (void) ns_printer_destroy(printer); return (status); } if (strcmp(isdefault, "true") == 0) { (void) free(printer->name); printer->name = strdup("_default"); printer->attributes = NULL; attrList = NULL; item = (char *)malloc(strlen("use") + strlen(printername) + 4); if (item == NULL) { (void) ns_printer_destroy(printer); return (1); } sprintf(item, "%s=%s", "use", printername); attrList = (char **)list_append((void**)attrList, (void *)item); ((NS_LDAPDATA *)(printer->nsdata))->attrList = attrList; status = ns_printer_put(printer); _freeList(&attrList); free(printer->nsdata); if (status != 0) { (void) ns_printer_destroy(printer); return (status); } } (void) ns_printer_destroy(printer); return (0); } /* * Modify printer object in the LDAP directory DIT */ if ((printer = (ns_printer_t *) ns_printer_get_name(printername, "ldap")) == NULL) { return (1); } printer->cred = cred; printer->source = strdup("ldap"); if ((comment != NULL) && (strlen(comment) > 0)) { item = (char *)malloc(strlen("description") + strlen(comment) + 4); if (item == NULL) { (void) ns_printer_destroy(printer); return (1); } sprintf(item, "%s=%s", "description", comment); attrList = (char **)list_append((void**)attrList, (void *)item); } else { item = (char *)malloc(strlen("description") + 4); if (item == NULL) { (void) ns_printer_destroy(printer); return (1); } sprintf(item, "%s=", "description"); attrList = (char **)list_append((void**)attrList, (void *)item); } printer->attributes = NULL; printer->nsdata = malloc(sizeof (NS_LDAPDATA)); if (printer->nsdata == NULL) { (void) ns_printer_destroy(printer); return (1); } ((NS_LDAPDATA *)(printer->nsdata))->attrList = attrList; status = ns_printer_put(printer); _freeList(&attrList); free(printer->nsdata); if (status != 0) { (void) ns_printer_destroy(printer); return (status); } /* * Handle the default printer. */ if ((printer = (ns_printer_t *) ns_printer_get_name("_default", "ldap")) != NULL) { char *dflt = (char *)ns_get_value_string("use", printer); printer->source = strdup("ldap"); printer->cred = cred; if (strcmp(printername, dflt) == 0) { if (strcmp(isdefault, "false") == 0) { /* * We were the default printer but not * any more. So delete the default entry */ printer->attributes = NULL; printer->nsdata = malloc(sizeof (NS_LDAPDATA)); if (printer->nsdata == NULL) { (void) ns_printer_destroy(printer); return (1); } ((NS_LDAPDATA *)(printer->nsdata))->attrList = NULL; status = ns_printer_put(printer); free(printer->nsdata); if (status != 0) { (void) ns_printer_destroy(printer); return (status); } } } else if (strcmp(isdefault, "true") == 0) { /* * Modify this default entry to use us. */ printer->attributes = NULL; printer->nsdata = malloc(sizeof (NS_LDAPDATA)); if (printer->nsdata == NULL) { (void) ns_printer_destroy(printer); return (1); } attrList = NULL; item = (char *)malloc(strlen("use") + strlen(printername) + 4); if (item == NULL) { (void) ns_printer_destroy(printer); return (1); } sprintf(item, "%s=%s", "use", printername); attrList = (char **)list_append((void**)attrList, (void *)item); ((NS_LDAPDATA *)(printer->nsdata))->attrList = attrList; status = ns_printer_put(printer); _freeList(&attrList); free(printer->nsdata); if (status != 0) { (void) ns_printer_destroy(printer); return (status); } } } else if (strcmp(isdefault, "true") == 0) { /* * No default entry existed and we need one. */ printer = (ns_printer_t *)malloc(sizeof (*printer)); (void) memset(printer, 0, sizeof (*printer)); printer->name = strdup("_default"); printer->source = strdup("ldap"); printer->cred = cred; printer->nsdata = malloc(sizeof (NS_LDAPDATA)); if (printer->nsdata == NULL) { (void) ns_printer_destroy(printer); return (1); } attrList = NULL; item = (char *)malloc(strlen("use") + strlen(printername) + 4); if (item == NULL) { (void) ns_printer_destroy(printer); return (1); } sprintf(item, "%s=%s", "use", printername); attrList = (char **)list_append((void**)attrList, (void *)item); ((NS_LDAPDATA *)(printer->nsdata))->attrList = attrList; status = ns_printer_put(printer); _freeList(&attrList); free(printer->nsdata); if (status != 0) { (void) ns_printer_destroy(printer); return (status); } } (void) ns_printer_destroy(printer); return (0); }
/* * adaptor_avaliable() takes in the name of a printer, looks it up in the * name service, and dynamically loads backend support for the print paradigm * the printer is defined in. If the printer is undefined, UNDEFINED is * returned. If the spooling paradigm is not defined, and the printer is * remote, a "cascade" capability is loaded. */ int adaptor_available(const char *printer) { char *path, *dir, *tmp, *tmp_path; ns_bsd_addr_t *addr; /* * for performance, check lpsched first and foremost. This will * hide any NS information if there is an LP configuration, valid * or not. */ if (lpsched_adaptor_available(printer) == 0) return (0); errno = 0; if (((printer_object = ns_printer_get_name(printer, NS_SVC_ETC)) == NULL) && (endprinterentry() == 0) && ((printer_object = ns_printer_get_name(printer, NULL)) == NULL)) { errno = ENOENT; return (-1); } if ((addr = ns_get_value(NS_KEY_BSDADDR, printer_object)) != NULL) primary_name = addr->printer; if ((paradigm_name = ns_get_value_string(NS_KEY_ADAPTOR_NAME, printer_object)) == NULL) { if ((addr != NULL) && (is_localhost(addr->server) == 0)) paradigm_name = LPSCHED; else paradigm_name = CASCADE; } if ((tmp = strrchr(paradigm_name, ',')) != NULL) { *tmp++ = NULL; paradigm_version = atoi(tmp); } if ((path = ns_get_value_string(NS_KEY_ADAPTOR_PATH, printer_object)) == NULL) path = ADAPTOR_PATH; tmp_path = strdup(path); for (dir = strtok(tmp_path, ":,"); dir != NULL; dir = strtok(NULL, ":,")) { static char object[BUFSIZ]; if (paradigm_version < 0) (void) snprintf(object, sizeof (object), "%s/bsd_%s.so", dir, paradigm_name); else (void) snprintf(object, sizeof (object), "%s/bsd_%s.so.%d", dir, paradigm_name, paradigm_version); if ((paradigm_handle = dlopen(object, RTLD_NOW|RTLD_GLOBAL)) != NULL) break; #ifdef DEBUG syslog(LOG_DEBUG, "dlopen(%d): %s", object, dlerror()); #endif } free(tmp_path); return (paradigm_handle == NULL); }
int _updateoldyp( const char *action, const char *printername, const char *printserver, const char *extensions, const char *comment, const char *isdefault) { ns_printer_t *printer; ns_bsd_addr_t *addr; int status = 0; char mkcmd[BUFSIZ]; char *domain = NULL; char *host = NULL; /* * libprint returns before we know that the printers.conf * map is made. So we'll make it again. */ (void) yp_get_default_domain(&domain); if ((yp_master(domain, "printers.conf.byname", &host) != 0) && (yp_master(domain, "passwd.byname", &host) != 0)) { strcpy(mkcmd, "/usr/bin/sleep 1"); } else { sprintf(mkcmd, "/usr/bin/rsh -n %s 'cd /var/yp; " "/usr/ccs/bin/make -f /var/yp/Makefile " "-f /var/yp/Makefile.print printers.conf " "> /dev/null'", host); } if (strcmp(action, "delete") == 0) { if ((printer = (ns_printer_t *) ns_printer_get_name(printername, "nis")) == NULL) { return (0); } printer->attributes = NULL; status = ns_printer_put(printer); if (status != 0) { (void) free(printer); return (status); } if ((printer = (ns_printer_t *) ns_printer_get_name("_default", "nis")) != NULL) { char *dflt = (char *) ns_get_value_string("use", printer); if ((dflt != NULL) && (strcmp(dflt, printername) == 0)) { printer->attributes = NULL; status = ns_printer_put(printer); if (status != 0) { (void) free(printer); return (status); } } } (void) free(printer); (void) system(mkcmd); return (0); } else if (strcmp(action, "add") == 0) { printer = (ns_printer_t *)malloc(sizeof (*printer)); memset(printer, 0, sizeof (*printer)); printer->name = (char *)printername; printer->source = "nis"; addr = (ns_bsd_addr_t *)malloc(sizeof (*addr)); memset(addr, 0, sizeof (*addr)); addr->printer = (char *)printername; addr->server = (char *)printserver; if ((extensions != NULL) && (strlen(extensions) > 0)) { addr->extension = (char *)extensions; } ns_set_value("bsdaddr", addr, printer); if ((comment != NULL) && (strlen(comment) > 0)) { ns_set_value_from_string("description", comment, printer); } status = ns_printer_put(printer); if (status != 0) { (void) free(addr); (void) free(printer); return (status); } if (strcmp(isdefault, "true") == 0) { printer->name = "_default"; printer->attributes = NULL; ns_set_value_from_string("use", printername, printer); status = ns_printer_put(printer); if (status != 0) { (void) free(addr); (void) free(printer); return (status); } } (void) free(addr); (void) free(printer); (void) system(mkcmd); return (0); } /* * Modify */ if ((printer = (ns_printer_t *) ns_printer_get_name(printername, "nis")) == NULL) { return (1); } if ((comment != NULL) && (strlen(comment) > 0)) { ns_set_value_from_string("description", comment, printer); } else { ns_set_value_from_string("description", NULL, printer); } status = ns_printer_put(printer); if (status != 0) { (void) free(printer); return (status); } if ((printer = (ns_printer_t *) ns_printer_get_name("_default", "nis")) != NULL) { char *dflt = (char *)ns_get_value_string("use", printer); if (strcmp(printername, dflt) == 0) { if (strcmp(isdefault, "false") == 0) { /* * We were the default printer but not * any more. */ printer->attributes = NULL; status = ns_printer_put(printer); if (status != 0) { (void) free(printer); return (status); } } } else { if (strcmp(isdefault, "true") == 0) { ns_set_value_from_string("use", printername, printer); status = ns_printer_put(printer); if (status != 0) { (void) free(printer); return (status); } } } } else { printer = (ns_printer_t *)malloc(sizeof (*printer)); memset(printer, 0, sizeof (*printer)); printer->name = "_default"; printer->source = "nis"; ns_set_value_from_string("use", printername, printer); status = ns_printer_put(printer); if (status != 0) { (void) free(printer); return (status); } } (void) system(mkcmd); return (0); }