17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate * CDDL HEADER START
37c478bd9Sstevel@tonic-gate *
47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the
545916cd2Sjpk * Common Development and Distribution License (the "License").
645916cd2Sjpk * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate *
87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate * and limitations under the License.
127c478bd9Sstevel@tonic-gate *
137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate *
197c478bd9Sstevel@tonic-gate * CDDL HEADER END
207c478bd9Sstevel@tonic-gate */
217c478bd9Sstevel@tonic-gate /*
22c389c7f8SGowtham Thommandra * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
237c478bd9Sstevel@tonic-gate * Use is subject to license terms.
247c478bd9Sstevel@tonic-gate */
257c478bd9Sstevel@tonic-gate
267c478bd9Sstevel@tonic-gate /*LINTLIBRARY*/
277c478bd9Sstevel@tonic-gate
287c478bd9Sstevel@tonic-gate #include <stdlib.h>
297c478bd9Sstevel@tonic-gate #include <string.h>
307c478bd9Sstevel@tonic-gate #include <libintl.h>
317c478bd9Sstevel@tonic-gate #include <papi_impl.h>
327c478bd9Sstevel@tonic-gate #include <lp.h>
337c478bd9Sstevel@tonic-gate
347c478bd9Sstevel@tonic-gate extern int isclass(char *);
357c478bd9Sstevel@tonic-gate
367c478bd9Sstevel@tonic-gate void
papiPrinterFree(papi_printer_t printer)377c478bd9Sstevel@tonic-gate papiPrinterFree(papi_printer_t printer)
387c478bd9Sstevel@tonic-gate {
397c478bd9Sstevel@tonic-gate printer_t *tmp = printer;
407c478bd9Sstevel@tonic-gate
417c478bd9Sstevel@tonic-gate if (tmp != NULL) {
427c478bd9Sstevel@tonic-gate papiAttributeListFree(tmp->attributes);
437c478bd9Sstevel@tonic-gate free(tmp);
447c478bd9Sstevel@tonic-gate }
457c478bd9Sstevel@tonic-gate }
467c478bd9Sstevel@tonic-gate
477c478bd9Sstevel@tonic-gate void
papiPrinterListFree(papi_printer_t * printers)487c478bd9Sstevel@tonic-gate papiPrinterListFree(papi_printer_t *printers)
497c478bd9Sstevel@tonic-gate {
507c478bd9Sstevel@tonic-gate if (printers != NULL) {
517c478bd9Sstevel@tonic-gate int i;
527c478bd9Sstevel@tonic-gate
537c478bd9Sstevel@tonic-gate for (i = 0; printers[i] != NULL; i++)
547c478bd9Sstevel@tonic-gate papiPrinterFree(printers[i]);
557c478bd9Sstevel@tonic-gate free(printers);
567c478bd9Sstevel@tonic-gate }
577c478bd9Sstevel@tonic-gate }
587c478bd9Sstevel@tonic-gate
597c478bd9Sstevel@tonic-gate papi_status_t
papiPrintersList(papi_service_t handle,char ** requested_attrs,papi_filter_t * filter,papi_printer_t ** printers)60355b4669Sjacobs papiPrintersList(papi_service_t handle, char **requested_attrs,
61355b4669Sjacobs papi_filter_t *filter, papi_printer_t **printers)
627c478bd9Sstevel@tonic-gate {
637c478bd9Sstevel@tonic-gate service_t *svc = handle;
647c478bd9Sstevel@tonic-gate printer_t *p = NULL;
657c478bd9Sstevel@tonic-gate short status = MOK;
667c478bd9Sstevel@tonic-gate char *printer = NULL,
677c478bd9Sstevel@tonic-gate *form = NULL,
687c478bd9Sstevel@tonic-gate *request_id = NULL,
697c478bd9Sstevel@tonic-gate *character_set = NULL,
707c478bd9Sstevel@tonic-gate *reject_reason = NULL,
717c478bd9Sstevel@tonic-gate *disable_reason = NULL;
727c478bd9Sstevel@tonic-gate short printer_status = 0;
737c478bd9Sstevel@tonic-gate long enable_date = 0, reject_date = 0;
747c478bd9Sstevel@tonic-gate
757c478bd9Sstevel@tonic-gate if ((handle == NULL) || (printers == NULL))
767c478bd9Sstevel@tonic-gate return (PAPI_BAD_ARGUMENT);
777c478bd9Sstevel@tonic-gate
787c478bd9Sstevel@tonic-gate if ((filter == NULL) ||
797c478bd9Sstevel@tonic-gate ((filter->filter.bitmask.mask & PAPI_PRINTER_LOCAL) ==
807c478bd9Sstevel@tonic-gate (filter->filter.bitmask.value & PAPI_PRINTER_LOCAL))) {
817c478bd9Sstevel@tonic-gate /* ask the spooler for the printer(s) and state */
827c478bd9Sstevel@tonic-gate if (snd_msg(svc, S_INQUIRE_PRINTER_STATUS, NAME_ALL) < 0)
837c478bd9Sstevel@tonic-gate return (PAPI_SERVICE_UNAVAILABLE);
847c478bd9Sstevel@tonic-gate
857c478bd9Sstevel@tonic-gate do {
867c478bd9Sstevel@tonic-gate if (rcv_msg(svc, R_INQUIRE_PRINTER_STATUS, &status,
877c478bd9Sstevel@tonic-gate &printer, &form, &character_set,
887c478bd9Sstevel@tonic-gate &disable_reason, &reject_reason,
897c478bd9Sstevel@tonic-gate &printer_status, &request_id,
907c478bd9Sstevel@tonic-gate &enable_date, &reject_date) < 0)
917c478bd9Sstevel@tonic-gate return (PAPI_SERVICE_UNAVAILABLE);
927c478bd9Sstevel@tonic-gate
937c478bd9Sstevel@tonic-gate if ((p = calloc(1, sizeof (*p))) == NULL)
947c478bd9Sstevel@tonic-gate return (PAPI_TEMPORARY_ERROR);
957c478bd9Sstevel@tonic-gate
967c478bd9Sstevel@tonic-gate lpsched_printer_configuration_to_attributes(svc, p,
977c478bd9Sstevel@tonic-gate printer);
987c478bd9Sstevel@tonic-gate
997c478bd9Sstevel@tonic-gate printer_status_to_attributes(p, printer, form,
1007c478bd9Sstevel@tonic-gate character_set, disable_reason,
1017c478bd9Sstevel@tonic-gate reject_reason, printer_status,
1027c478bd9Sstevel@tonic-gate request_id, enable_date, reject_date);
1037c478bd9Sstevel@tonic-gate
1047c478bd9Sstevel@tonic-gate list_append(printers, p);
1057c478bd9Sstevel@tonic-gate
1067c478bd9Sstevel@tonic-gate } while (status == MOKMORE);
1077c478bd9Sstevel@tonic-gate }
1087c478bd9Sstevel@tonic-gate
1097c478bd9Sstevel@tonic-gate if ((filter == NULL) ||
1107c478bd9Sstevel@tonic-gate ((filter->filter.bitmask.mask & PAPI_PRINTER_CLASS) ==
1117c478bd9Sstevel@tonic-gate (filter->filter.bitmask.value & PAPI_PRINTER_CLASS))) {
1127c478bd9Sstevel@tonic-gate /* ask the spooler for the class(es) and state */
1137c478bd9Sstevel@tonic-gate if (snd_msg(svc, S_INQUIRE_CLASS, NAME_ALL) < 0)
1147c478bd9Sstevel@tonic-gate return (PAPI_SERVICE_UNAVAILABLE);
1157c478bd9Sstevel@tonic-gate
1167c478bd9Sstevel@tonic-gate do {
1177c478bd9Sstevel@tonic-gate if (rcv_msg(svc, R_INQUIRE_CLASS, &status, &printer,
1187c478bd9Sstevel@tonic-gate &printer_status, &reject_reason,
1197c478bd9Sstevel@tonic-gate &reject_date) < 0)
1207c478bd9Sstevel@tonic-gate return (PAPI_SERVICE_UNAVAILABLE);
1217c478bd9Sstevel@tonic-gate
1227c478bd9Sstevel@tonic-gate if ((p = calloc(1, sizeof (*p))) == NULL)
1237c478bd9Sstevel@tonic-gate return (PAPI_TEMPORARY_ERROR);
1247c478bd9Sstevel@tonic-gate
1257c478bd9Sstevel@tonic-gate lpsched_class_configuration_to_attributes(svc, p,
1267c478bd9Sstevel@tonic-gate printer);
1277c478bd9Sstevel@tonic-gate
1287c478bd9Sstevel@tonic-gate class_status_to_attributes(p, printer, printer_status,
1297c478bd9Sstevel@tonic-gate reject_reason, reject_date);
1307c478bd9Sstevel@tonic-gate
1317c478bd9Sstevel@tonic-gate list_append(printers, p);
1327c478bd9Sstevel@tonic-gate
1337c478bd9Sstevel@tonic-gate } while (status == MOKMORE);
1347c478bd9Sstevel@tonic-gate }
1357c478bd9Sstevel@tonic-gate
1367c478bd9Sstevel@tonic-gate return (PAPI_OK);
1377c478bd9Sstevel@tonic-gate }
1387c478bd9Sstevel@tonic-gate
1397c478bd9Sstevel@tonic-gate papi_status_t
papiPrinterQuery(papi_service_t handle,char * name,char ** requested_attrs,papi_attribute_t ** job_attrs,papi_printer_t * printer)140355b4669Sjacobs papiPrinterQuery(papi_service_t handle, char *name,
141355b4669Sjacobs char **requested_attrs,
142355b4669Sjacobs papi_attribute_t **job_attrs,
1437c478bd9Sstevel@tonic-gate papi_printer_t *printer)
1447c478bd9Sstevel@tonic-gate {
1457c478bd9Sstevel@tonic-gate papi_status_t pst;
1467c478bd9Sstevel@tonic-gate service_t *svc = handle;
1477c478bd9Sstevel@tonic-gate printer_t *p = NULL;
1487c478bd9Sstevel@tonic-gate char *dest;
1497c478bd9Sstevel@tonic-gate short status = MOK;
1507c478bd9Sstevel@tonic-gate char *pname = NULL,
1517c478bd9Sstevel@tonic-gate *form = NULL,
1527c478bd9Sstevel@tonic-gate *request_id = NULL,
1537c478bd9Sstevel@tonic-gate *character_set = NULL,
1547c478bd9Sstevel@tonic-gate *reject_reason = NULL,
1557c478bd9Sstevel@tonic-gate *disable_reason = NULL;
1567c478bd9Sstevel@tonic-gate short printer_status = 0;
1577c478bd9Sstevel@tonic-gate long enable_date = 0, reject_date = 0;
1587c478bd9Sstevel@tonic-gate
1597c478bd9Sstevel@tonic-gate if ((handle == NULL) || (name == NULL) || (printer == NULL))
1607c478bd9Sstevel@tonic-gate return (PAPI_BAD_ARGUMENT);
1617c478bd9Sstevel@tonic-gate
1627c478bd9Sstevel@tonic-gate if ((*printer = p = calloc(1, sizeof (*p))) == NULL)
1637c478bd9Sstevel@tonic-gate return (PAPI_TEMPORARY_ERROR);
1647c478bd9Sstevel@tonic-gate
1657c478bd9Sstevel@tonic-gate dest = printer_name_from_uri_id(name, -1);
1667c478bd9Sstevel@tonic-gate
167355b4669Sjacobs if (strcmp(dest, "_default") == 0) {
168355b4669Sjacobs static char *_default;
169355b4669Sjacobs
170355b4669Sjacobs if (_default == NULL) {
171355b4669Sjacobs int fd;
172355b4669Sjacobs static char buf[128];
173355b4669Sjacobs
174355b4669Sjacobs if ((fd = open("/etc/lp/default", O_RDONLY)) >= 0) {
175355b4669Sjacobs read(fd, buf, sizeof (buf));
176355b4669Sjacobs close(fd);
177355b4669Sjacobs _default = strtok(buf, " \t\n");
178355b4669Sjacobs }
179355b4669Sjacobs }
180355b4669Sjacobs dest = _default;
181355b4669Sjacobs }
182355b4669Sjacobs
1837c478bd9Sstevel@tonic-gate if (isprinter(dest) != 0) {
1847c478bd9Sstevel@tonic-gate pst = lpsched_printer_configuration_to_attributes(svc, p, dest);
1857c478bd9Sstevel@tonic-gate if (pst != PAPI_OK)
1867c478bd9Sstevel@tonic-gate return (pst);
1877c478bd9Sstevel@tonic-gate
1887c478bd9Sstevel@tonic-gate /* get the spooler status data now */
1897c478bd9Sstevel@tonic-gate if (snd_msg(svc, S_INQUIRE_PRINTER_STATUS, dest) < 0)
1907c478bd9Sstevel@tonic-gate return (PAPI_SERVICE_UNAVAILABLE);
1917c478bd9Sstevel@tonic-gate
1927c478bd9Sstevel@tonic-gate if (rcv_msg(svc, R_INQUIRE_PRINTER_STATUS, &status, &pname,
1937c478bd9Sstevel@tonic-gate &form, &character_set, &disable_reason,
1947c478bd9Sstevel@tonic-gate &reject_reason, &printer_status, &request_id,
1957c478bd9Sstevel@tonic-gate &enable_date, &reject_date) < 0)
1967c478bd9Sstevel@tonic-gate return (PAPI_SERVICE_UNAVAILABLE);
1977c478bd9Sstevel@tonic-gate
1987c478bd9Sstevel@tonic-gate printer_status_to_attributes(p, pname, form, character_set,
1997c478bd9Sstevel@tonic-gate disable_reason, reject_reason, printer_status,
2007c478bd9Sstevel@tonic-gate request_id, enable_date, reject_date);
2017c478bd9Sstevel@tonic-gate } else if (isclass(dest) != 0) {
2027c478bd9Sstevel@tonic-gate pst = lpsched_class_configuration_to_attributes(svc, p, dest);
2037c478bd9Sstevel@tonic-gate if (pst != PAPI_OK)
2047c478bd9Sstevel@tonic-gate return (pst);
2057c478bd9Sstevel@tonic-gate
2067c478bd9Sstevel@tonic-gate /* get the spooler status data now */
2077c478bd9Sstevel@tonic-gate if (snd_msg(svc, S_INQUIRE_CLASS, dest) < 0)
2087c478bd9Sstevel@tonic-gate return (PAPI_SERVICE_UNAVAILABLE);
2097c478bd9Sstevel@tonic-gate
2107c478bd9Sstevel@tonic-gate if (rcv_msg(svc, R_INQUIRE_CLASS, &status, &pname,
2117c478bd9Sstevel@tonic-gate &printer_status, &reject_reason,
2127c478bd9Sstevel@tonic-gate &reject_date) < 0)
2137c478bd9Sstevel@tonic-gate return (PAPI_SERVICE_UNAVAILABLE);
2147c478bd9Sstevel@tonic-gate
2157c478bd9Sstevel@tonic-gate class_status_to_attributes(p, pname, printer_status,
2167c478bd9Sstevel@tonic-gate reject_reason, reject_date);
2177c478bd9Sstevel@tonic-gate } else if (strcmp(dest, "PrintService") == 0) {
2187c478bd9Sstevel@tonic-gate /* fill the printer object with service information */
219355b4669Sjacobs lpsched_service_information(&p->attributes);
2207c478bd9Sstevel@tonic-gate } else
2217c478bd9Sstevel@tonic-gate return (PAPI_NOT_FOUND);
2227c478bd9Sstevel@tonic-gate
2237c478bd9Sstevel@tonic-gate free(dest);
2247c478bd9Sstevel@tonic-gate
2257c478bd9Sstevel@tonic-gate return (PAPI_OK);
2267c478bd9Sstevel@tonic-gate }
2277c478bd9Sstevel@tonic-gate
2287c478bd9Sstevel@tonic-gate papi_status_t
papiPrinterAdd(papi_service_t handle,char * name,papi_attribute_t ** attributes,papi_printer_t * result)229355b4669Sjacobs papiPrinterAdd(papi_service_t handle, char *name,
230355b4669Sjacobs papi_attribute_t **attributes, papi_printer_t *result)
2317c478bd9Sstevel@tonic-gate {
232355b4669Sjacobs papi_status_t status;
233355b4669Sjacobs printer_t *p = NULL;
234355b4669Sjacobs char *dest;
2357c478bd9Sstevel@tonic-gate
236355b4669Sjacobs if ((handle == NULL) || (name == NULL) || (attributes == NULL))
2377c478bd9Sstevel@tonic-gate return (PAPI_BAD_ARGUMENT);
2387c478bd9Sstevel@tonic-gate
239355b4669Sjacobs dest = printer_name_from_uri_id(name, -1);
240355b4669Sjacobs
241355b4669Sjacobs if (isprinter(dest) != 0) {
242355b4669Sjacobs status = lpsched_add_modify_printer(handle, dest,
243355b4669Sjacobs attributes, 0);
244355b4669Sjacobs
245355b4669Sjacobs if ((*result = p = calloc(1, sizeof (*p))) != NULL)
246355b4669Sjacobs lpsched_printer_configuration_to_attributes(handle, p,
247355b4669Sjacobs dest);
248355b4669Sjacobs else
249355b4669Sjacobs status = PAPI_TEMPORARY_ERROR;
250355b4669Sjacobs
251355b4669Sjacobs } else if (isclass(dest) != 0) {
252355b4669Sjacobs status = lpsched_add_modify_class(handle, dest, attributes);
253355b4669Sjacobs
254355b4669Sjacobs if ((*result = p = calloc(1, sizeof (*p))) != NULL)
255355b4669Sjacobs lpsched_class_configuration_to_attributes(handle, p,
256355b4669Sjacobs dest);
257355b4669Sjacobs else
258355b4669Sjacobs status = PAPI_TEMPORARY_ERROR;
259355b4669Sjacobs
260355b4669Sjacobs } else
261355b4669Sjacobs status = PAPI_NOT_FOUND;
262355b4669Sjacobs
263355b4669Sjacobs free(dest);
264355b4669Sjacobs
265355b4669Sjacobs return (status);
2667c478bd9Sstevel@tonic-gate }
2677c478bd9Sstevel@tonic-gate
2687c478bd9Sstevel@tonic-gate papi_status_t
papiPrinterModify(papi_service_t handle,char * name,papi_attribute_t ** attributes,papi_printer_t * result)269355b4669Sjacobs papiPrinterModify(papi_service_t handle, char *name,
270355b4669Sjacobs papi_attribute_t **attributes, papi_printer_t *result)
271355b4669Sjacobs {
272355b4669Sjacobs papi_status_t status;
273355b4669Sjacobs printer_t *p = NULL;
274355b4669Sjacobs char *dest;
275355b4669Sjacobs
276355b4669Sjacobs if ((handle == NULL) || (name == NULL) || (attributes == NULL))
277355b4669Sjacobs return (PAPI_BAD_ARGUMENT);
278355b4669Sjacobs
279355b4669Sjacobs dest = printer_name_from_uri_id(name, -1);
280355b4669Sjacobs
281355b4669Sjacobs if (isprinter(dest) != 0) {
282355b4669Sjacobs status = lpsched_add_modify_printer(handle, dest,
283355b4669Sjacobs attributes, 1);
284355b4669Sjacobs
285355b4669Sjacobs if ((*result = p = calloc(1, sizeof (*p))) != NULL)
286355b4669Sjacobs lpsched_printer_configuration_to_attributes(handle, p,
287355b4669Sjacobs dest);
288355b4669Sjacobs else
289355b4669Sjacobs status = PAPI_TEMPORARY_ERROR;
290355b4669Sjacobs } else if (isclass(dest) != 0) {
291355b4669Sjacobs status = lpsched_add_modify_class(handle, dest, attributes);
292355b4669Sjacobs
293355b4669Sjacobs if ((*result = p = calloc(1, sizeof (*p))) != NULL)
294355b4669Sjacobs lpsched_class_configuration_to_attributes(handle, p,
295355b4669Sjacobs dest);
296355b4669Sjacobs else
297355b4669Sjacobs status = PAPI_TEMPORARY_ERROR;
298355b4669Sjacobs } else
299355b4669Sjacobs status = PAPI_NOT_FOUND;
300355b4669Sjacobs
301355b4669Sjacobs free(dest);
302355b4669Sjacobs
303355b4669Sjacobs return (status);
304355b4669Sjacobs }
305355b4669Sjacobs
306355b4669Sjacobs papi_status_t
papiPrinterRemove(papi_service_t handle,char * name)307355b4669Sjacobs papiPrinterRemove(papi_service_t handle, char *name)
308355b4669Sjacobs {
309355b4669Sjacobs papi_status_t result;
310355b4669Sjacobs char *dest;
311355b4669Sjacobs
312355b4669Sjacobs if ((handle == NULL) || (name == NULL))
313355b4669Sjacobs return (PAPI_BAD_ARGUMENT);
314355b4669Sjacobs
315355b4669Sjacobs dest = printer_name_from_uri_id(name, -1);
316355b4669Sjacobs
317355b4669Sjacobs if (isprinter(dest) != 0) {
318355b4669Sjacobs result = lpsched_remove_printer(handle, dest);
319355b4669Sjacobs } else if (isclass(dest) != 0) {
320355b4669Sjacobs result = lpsched_remove_class(handle, dest);
321355b4669Sjacobs } else
322355b4669Sjacobs result = PAPI_NOT_FOUND;
323355b4669Sjacobs
324355b4669Sjacobs free(dest);
325355b4669Sjacobs
326355b4669Sjacobs return (result);
327355b4669Sjacobs }
328355b4669Sjacobs
329355b4669Sjacobs papi_status_t
papiPrinterDisable(papi_service_t handle,char * name,char * message)330355b4669Sjacobs papiPrinterDisable(papi_service_t handle, char *name, char *message)
3317c478bd9Sstevel@tonic-gate {
3327c478bd9Sstevel@tonic-gate papi_status_t result;
3337c478bd9Sstevel@tonic-gate
3347c478bd9Sstevel@tonic-gate if ((handle == NULL) || (name == NULL))
3357c478bd9Sstevel@tonic-gate return (PAPI_BAD_ARGUMENT);
3367c478bd9Sstevel@tonic-gate
3377c478bd9Sstevel@tonic-gate result = lpsched_disable_printer(handle, name, message);
3387c478bd9Sstevel@tonic-gate
3397c478bd9Sstevel@tonic-gate return (result);
3407c478bd9Sstevel@tonic-gate }
3417c478bd9Sstevel@tonic-gate
3427c478bd9Sstevel@tonic-gate papi_status_t
papiPrinterEnable(papi_service_t handle,char * name)343355b4669Sjacobs papiPrinterEnable(papi_service_t handle, char *name)
3447c478bd9Sstevel@tonic-gate {
3457c478bd9Sstevel@tonic-gate papi_status_t result;
3467c478bd9Sstevel@tonic-gate
3477c478bd9Sstevel@tonic-gate if ((handle == NULL) || (name == NULL))
3487c478bd9Sstevel@tonic-gate return (PAPI_BAD_ARGUMENT);
3497c478bd9Sstevel@tonic-gate
3507c478bd9Sstevel@tonic-gate result = lpsched_enable_printer(handle, name);
3517c478bd9Sstevel@tonic-gate
3527c478bd9Sstevel@tonic-gate return (result);
3537c478bd9Sstevel@tonic-gate }
3547c478bd9Sstevel@tonic-gate
3557c478bd9Sstevel@tonic-gate papi_status_t
papiPrinterPause(papi_service_t handle,char * name,char * message)356355b4669Sjacobs papiPrinterPause(papi_service_t handle, char *name, char *message)
357355b4669Sjacobs {
358355b4669Sjacobs papi_status_t result;
359355b4669Sjacobs
360355b4669Sjacobs if ((handle == NULL) || (name == NULL))
361355b4669Sjacobs return (PAPI_BAD_ARGUMENT);
362355b4669Sjacobs
363355b4669Sjacobs result = lpsched_reject_printer(handle, name, message);
364355b4669Sjacobs
365355b4669Sjacobs return (result);
366355b4669Sjacobs }
367355b4669Sjacobs
368355b4669Sjacobs papi_status_t
papiPrinterResume(papi_service_t handle,char * name)369355b4669Sjacobs papiPrinterResume(papi_service_t handle, char *name)
370355b4669Sjacobs {
371355b4669Sjacobs papi_status_t result;
372355b4669Sjacobs
373355b4669Sjacobs if ((handle == NULL) || (name == NULL))
374355b4669Sjacobs return (PAPI_BAD_ARGUMENT);
375355b4669Sjacobs
376355b4669Sjacobs result = lpsched_accept_printer(handle, name);
377355b4669Sjacobs
378355b4669Sjacobs return (result);
379355b4669Sjacobs }
380355b4669Sjacobs
381355b4669Sjacobs papi_status_t
papiPrinterPurgeJobs(papi_service_t handle,char * name,papi_job_t ** jobs)382355b4669Sjacobs papiPrinterPurgeJobs(papi_service_t handle, char *name, papi_job_t **jobs)
3837c478bd9Sstevel@tonic-gate {
3847c478bd9Sstevel@tonic-gate service_t *svc = handle;
3857c478bd9Sstevel@tonic-gate papi_status_t result = PAPI_OK_SUBST;
3867c478bd9Sstevel@tonic-gate short more;
3877c478bd9Sstevel@tonic-gate long status;
3887c478bd9Sstevel@tonic-gate char *dest;
3897c478bd9Sstevel@tonic-gate char *req_id;
3907c478bd9Sstevel@tonic-gate
3917c478bd9Sstevel@tonic-gate if ((handle == NULL) || (name == NULL))
3927c478bd9Sstevel@tonic-gate return (PAPI_BAD_ARGUMENT);
3937c478bd9Sstevel@tonic-gate
3947c478bd9Sstevel@tonic-gate dest = printer_name_from_uri_id(name, -1);
395355b4669Sjacobs more = snd_msg(svc, S_CANCEL, dest, "", "");
3967c478bd9Sstevel@tonic-gate free(dest);
397355b4669Sjacobs if (more < 0)
398355b4669Sjacobs return (PAPI_SERVICE_UNAVAILABLE);
3997c478bd9Sstevel@tonic-gate
4007c478bd9Sstevel@tonic-gate do {
4017c478bd9Sstevel@tonic-gate if (rcv_msg(svc, R_CANCEL, &more, &status, &req_id) < 0)
4027c478bd9Sstevel@tonic-gate return (PAPI_SERVICE_UNAVAILABLE);
4037c478bd9Sstevel@tonic-gate
4047c478bd9Sstevel@tonic-gate switch (status) {
4057c478bd9Sstevel@tonic-gate case MOK:
4067c478bd9Sstevel@tonic-gate papiAttributeListAddString(&svc->attributes, PAPI_ATTR_APPEND,
4077c478bd9Sstevel@tonic-gate "canceled-jobs", req_id);
4087c478bd9Sstevel@tonic-gate break;
4097c478bd9Sstevel@tonic-gate case M2LATE:
4107c478bd9Sstevel@tonic-gate case MUNKNOWN:
4117c478bd9Sstevel@tonic-gate case MNOINFO:
4127c478bd9Sstevel@tonic-gate papiAttributeListAddString(&svc->attributes, PAPI_ATTR_APPEND,
4137c478bd9Sstevel@tonic-gate "cancel-failed", req_id);
4147c478bd9Sstevel@tonic-gate result = PAPI_DEVICE_ERROR;
4157c478bd9Sstevel@tonic-gate break;
4167c478bd9Sstevel@tonic-gate case MNOPERM:
4177c478bd9Sstevel@tonic-gate papiAttributeListAddString(&svc->attributes, PAPI_ATTR_APPEND,
4187c478bd9Sstevel@tonic-gate "cancel-failed", req_id);
4197c478bd9Sstevel@tonic-gate result = PAPI_NOT_AUTHORIZED;
4207c478bd9Sstevel@tonic-gate break;
4217c478bd9Sstevel@tonic-gate default:
4227c478bd9Sstevel@tonic-gate detailed_error(svc, gettext("cancel failed, bad status (%d)\n"),
4237c478bd9Sstevel@tonic-gate status);
4247c478bd9Sstevel@tonic-gate return (PAPI_DEVICE_ERROR);
4257c478bd9Sstevel@tonic-gate }
4267c478bd9Sstevel@tonic-gate } while (more == MOKMORE);
4277c478bd9Sstevel@tonic-gate
4287c478bd9Sstevel@tonic-gate return (result);
4297c478bd9Sstevel@tonic-gate }
4307c478bd9Sstevel@tonic-gate
4317c478bd9Sstevel@tonic-gate papi_status_t
papiPrinterListJobs(papi_service_t handle,char * name,char ** requested_attrs,int type_mask,int max_num_jobs,papi_job_t ** jobs)432355b4669Sjacobs papiPrinterListJobs(papi_service_t handle, char *name,
433355b4669Sjacobs char **requested_attrs, int type_mask,
434355b4669Sjacobs int max_num_jobs, papi_job_t **jobs)
4357c478bd9Sstevel@tonic-gate {
4367c478bd9Sstevel@tonic-gate service_t *svc = handle;
4377c478bd9Sstevel@tonic-gate char *dest;
4387c478bd9Sstevel@tonic-gate short rc;
4397c478bd9Sstevel@tonic-gate int count = 1;
4407c478bd9Sstevel@tonic-gate
4417c478bd9Sstevel@tonic-gate if ((handle == NULL) || (name == NULL) || (jobs == NULL))
4427c478bd9Sstevel@tonic-gate return (PAPI_BAD_ARGUMENT);
4437c478bd9Sstevel@tonic-gate
4447c478bd9Sstevel@tonic-gate dest = printer_name_from_uri_id(name, -1);
4457c478bd9Sstevel@tonic-gate
4467c478bd9Sstevel@tonic-gate rc = snd_msg(svc, S_INQUIRE_REQUEST_RANK, 0, "", dest, "", "", "");
4477c478bd9Sstevel@tonic-gate free(dest);
4487c478bd9Sstevel@tonic-gate if (rc < 0)
4497c478bd9Sstevel@tonic-gate return (PAPI_SERVICE_UNAVAILABLE);
4507c478bd9Sstevel@tonic-gate
4517c478bd9Sstevel@tonic-gate do {
4527c478bd9Sstevel@tonic-gate job_t *job = NULL;
4537c478bd9Sstevel@tonic-gate char *dest = NULL,
4547c478bd9Sstevel@tonic-gate *ptr,
4557c478bd9Sstevel@tonic-gate *form = NULL,
4567c478bd9Sstevel@tonic-gate *req_id = NULL,
4577c478bd9Sstevel@tonic-gate *charset = NULL,
4587c478bd9Sstevel@tonic-gate *owner = NULL,
45945916cd2Sjpk *slabel = NULL,
4607c478bd9Sstevel@tonic-gate *file = NULL;
461*40e7ce05Ssonam gupta - Sun Microsystems - Bangalore India char request_file[128];
4627c478bd9Sstevel@tonic-gate time_t date = 0;
4637c478bd9Sstevel@tonic-gate size_t size = 0;
4647c478bd9Sstevel@tonic-gate short rank = 0, state = 0;
4657c478bd9Sstevel@tonic-gate
4667c478bd9Sstevel@tonic-gate if (rcv_msg(svc, R_INQUIRE_REQUEST_RANK, &rc, &req_id,
46745916cd2Sjpk &owner, &slabel, &size, &date, &state, &dest,
46845916cd2Sjpk &form, &charset, &rank, &file) < 0)
4697c478bd9Sstevel@tonic-gate return (PAPI_SERVICE_UNAVAILABLE);
4707c478bd9Sstevel@tonic-gate
4717c478bd9Sstevel@tonic-gate if ((rc != MOK) && (rc != MOKMORE))
4727c478bd9Sstevel@tonic-gate continue;
4737c478bd9Sstevel@tonic-gate /*
4747c478bd9Sstevel@tonic-gate * at this point, we should check to see if the job matches the
4757c478bd9Sstevel@tonic-gate * selection criterion defined in "type_mask".
4767c478bd9Sstevel@tonic-gate */
4777c478bd9Sstevel@tonic-gate
4787c478bd9Sstevel@tonic-gate /* too many yet? */
4797c478bd9Sstevel@tonic-gate if ((max_num_jobs != 0) && (count++ > max_num_jobs))
4807c478bd9Sstevel@tonic-gate continue;
4817c478bd9Sstevel@tonic-gate
4827c478bd9Sstevel@tonic-gate if ((job = calloc(1, sizeof (*job))) == NULL)
4837c478bd9Sstevel@tonic-gate continue;
4847c478bd9Sstevel@tonic-gate
485*40e7ce05Ssonam gupta - Sun Microsystems - Bangalore India /* Request file is <req_id>-0 */
486*40e7ce05Ssonam gupta - Sun Microsystems - Bangalore India if ((ptr = strrchr(req_id, '-')) != NULL) {
487*40e7ce05Ssonam gupta - Sun Microsystems - Bangalore India ++ptr;
488*40e7ce05Ssonam gupta - Sun Microsystems - Bangalore India snprintf(request_file, sizeof (request_file),
489*40e7ce05Ssonam gupta - Sun Microsystems - Bangalore India "%s-0", ptr);
4907c478bd9Sstevel@tonic-gate }
4917c478bd9Sstevel@tonic-gate
492*40e7ce05Ssonam gupta - Sun Microsystems - Bangalore India lpsched_read_job_configuration(svc, job, request_file);
4937c478bd9Sstevel@tonic-gate
494c389c7f8SGowtham Thommandra job_status_to_attributes(job, req_id, owner, slabel, size,
495c389c7f8SGowtham Thommandra date, state, dest, form, charset, rank, file);
496c389c7f8SGowtham Thommandra
4977c478bd9Sstevel@tonic-gate list_append(jobs, job);
4987c478bd9Sstevel@tonic-gate
4997c478bd9Sstevel@tonic-gate } while (rc == MOKMORE);
5007c478bd9Sstevel@tonic-gate
5017c478bd9Sstevel@tonic-gate if (rc == MNOINFO) /* If no jobs are found, it's still ok */
5027c478bd9Sstevel@tonic-gate rc = MOK;
5037c478bd9Sstevel@tonic-gate
5047c478bd9Sstevel@tonic-gate return (lpsched_status_to_papi_status(rc));
5057c478bd9Sstevel@tonic-gate }
5067c478bd9Sstevel@tonic-gate
5077c478bd9Sstevel@tonic-gate papi_attribute_t **
papiPrinterGetAttributeList(papi_printer_t printer)5087c478bd9Sstevel@tonic-gate papiPrinterGetAttributeList(papi_printer_t printer)
5097c478bd9Sstevel@tonic-gate {
5107c478bd9Sstevel@tonic-gate printer_t *tmp = printer;
5117c478bd9Sstevel@tonic-gate
5127c478bd9Sstevel@tonic-gate if (tmp == NULL)
5137c478bd9Sstevel@tonic-gate return (NULL);
5147c478bd9Sstevel@tonic-gate
5157c478bd9Sstevel@tonic-gate return (tmp->attributes);
5167c478bd9Sstevel@tonic-gate }
517