Exemplo n.º 1
0
/*
 *  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);
}
Exemplo n.º 2
0
/*
 * 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);
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
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);
}
Exemplo n.º 5
0
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);
}