1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 *
26 */
27
28 /* $Id: job.c 146 2006-03-24 00:26:54Z njacobs $ */
29
30 /*LINTLIBRARY*/
31
32 #include <stdlib.h>
33 #include <papi_impl.h>
34
35 void
papiJobFree(papi_job_t job)36 papiJobFree(papi_job_t job)
37 {
38 job_t *tmp = (job_t *)job;
39
40 if (tmp != NULL) {
41 void (*f)();
42
43 f = (void (*)())psm_sym(tmp->svc, "papiJobFree");
44 if (f != NULL)
45 f(tmp->job);
46 free(tmp);
47 }
48 }
49
50 void
papiJobListFree(papi_job_t * jobs)51 papiJobListFree(papi_job_t *jobs)
52 {
53 if (jobs != NULL) {
54 int i;
55
56 for (i = 0; jobs[i] != NULL; i++)
57 papiJobFree(jobs[i]);
58 free(jobs);
59 }
60 }
61
62 papi_attribute_t **
papiJobGetAttributeList(papi_job_t job)63 papiJobGetAttributeList(papi_job_t job)
64 {
65 papi_attribute_t **result = NULL;
66 job_t *j = job;
67
68 if (job != NULL) {
69 papi_attribute_t **(*f)();
70
71 f = (papi_attribute_t **(*)())psm_sym(j->svc,
72 "papiJobGetAttributeList");
73 if (f != NULL)
74 result = f(j->job);
75 }
76
77 return (result);
78 }
79
80 char *
papiJobGetPrinterName(papi_job_t job)81 papiJobGetPrinterName(papi_job_t job)
82 {
83 char *result = NULL;
84 job_t *j = job;
85
86 if (job != NULL) {
87 char *(*f)();
88
89 f = (char *(*)())psm_sym(j->svc, "papiJobGetPrinterName");
90 if (f != NULL)
91 result = f(j->job);
92 }
93
94 return (result);
95 }
96
97 int32_t
papiJobGetId(papi_job_t job)98 papiJobGetId(papi_job_t job)
99 {
100 int32_t result = -1;
101 job_t *j = job;
102
103 if (job != NULL) {
104 int32_t (*f)();
105
106 f = (int32_t (*)())psm_sym(j->svc, "papiJobGetId");
107 if (f != NULL)
108 result = f(j->job);
109 }
110
111 return (result);
112 }
113
114 papi_job_ticket_t *
papiJobGetJobTicket(papi_job_t job)115 papiJobGetJobTicket(papi_job_t job)
116 {
117 papi_job_ticket_t *result = NULL;
118 job_t *j = job;
119
120 if (job != NULL) {
121 papi_job_ticket_t *(*f)();
122
123 f = (papi_job_ticket_t *(*)())psm_sym(j->svc,
124 "papiJobGetJobTicket");
125 if (f != NULL)
126 result = f(j->job);
127 }
128
129 return (result);
130 }
131
132 /* common support for papiJob{Submit|SubmitByReference|Validate} */
133 static papi_status_t
_papi_job_submit_reference_or_validate(papi_service_t handle,char * printer,papi_attribute_t ** job_attributes,papi_job_ticket_t * job_ticket,char ** files,papi_job_t * job,char * function)134 _papi_job_submit_reference_or_validate(papi_service_t handle, char *printer,
135 papi_attribute_t **job_attributes,
136 papi_job_ticket_t *job_ticket, char **files, papi_job_t *job,
137 char *function)
138 {
139 papi_status_t result = PAPI_INTERNAL_ERROR;
140 service_t *svc = handle;
141 job_t *j = NULL;
142 papi_status_t (*f)();
143
144 if ((svc == NULL) || (printer == NULL) || (files == NULL) ||
145 (job == NULL))
146 return (PAPI_BAD_ARGUMENT);
147
148 if ((result = service_connect(svc, printer)) != PAPI_OK)
149 return (result);
150
151 if ((*job = j = calloc(1, sizeof (*j))) == NULL)
152 return (PAPI_TEMPORARY_ERROR);
153
154 j->svc = svc;
155 f = (papi_status_t (*)())psm_sym(j->svc, function);
156 if (f != NULL)
157 result = f(svc->svc_handle, svc->name, job_attributes,
158 job_ticket, files, &j->job);
159
160 return (result);
161 }
162
163 papi_status_t
papiJobSubmit(papi_service_t handle,char * printer,papi_attribute_t ** job_attributes,papi_job_ticket_t * job_ticket,char ** files,papi_job_t * job)164 papiJobSubmit(papi_service_t handle, char *printer,
165 papi_attribute_t **job_attributes,
166 papi_job_ticket_t *job_ticket, char **files, papi_job_t *job)
167 {
168 return (_papi_job_submit_reference_or_validate(handle, printer,
169 job_attributes, job_ticket, files, job,
170 "papiJobSubmit"));
171 }
172
173 papi_status_t
papiJobSubmitByReference(papi_service_t handle,char * printer,papi_attribute_t ** job_attributes,papi_job_ticket_t * job_ticket,char ** files,papi_job_t * job)174 papiJobSubmitByReference(papi_service_t handle, char *printer,
175 papi_attribute_t **job_attributes,
176 papi_job_ticket_t *job_ticket, char **files, papi_job_t *job)
177 {
178 return (_papi_job_submit_reference_or_validate(handle, printer,
179 job_attributes, job_ticket, files, job,
180 "papiJobSubmitByReference"));
181 }
182
183 papi_status_t
papiJobValidate(papi_service_t handle,char * printer,papi_attribute_t ** job_attributes,papi_job_ticket_t * job_ticket,char ** files,papi_job_t * job)184 papiJobValidate(papi_service_t handle, char *printer,
185 papi_attribute_t **job_attributes,
186 papi_job_ticket_t *job_ticket, char **files, papi_job_t *job)
187 {
188 return (_papi_job_submit_reference_or_validate(handle, printer,
189 job_attributes, job_ticket, files, job,
190 "papiJobValidate"));
191 }
192
193 papi_status_t
papiJobStreamOpen(papi_service_t handle,char * printer,papi_attribute_t ** job_attributes,papi_job_ticket_t * job_ticket,papi_stream_t * stream)194 papiJobStreamOpen(papi_service_t handle, char *printer,
195 papi_attribute_t **job_attributes,
196 papi_job_ticket_t *job_ticket, papi_stream_t *stream)
197 {
198 papi_status_t result = PAPI_INTERNAL_ERROR;
199 service_t *svc = handle;
200 papi_status_t (*f)();
201
202 if ((svc == NULL) || (printer == NULL) || (stream == NULL))
203 return (PAPI_BAD_ARGUMENT);
204
205 if ((result = service_connect(svc, printer)) != PAPI_OK)
206 return (result);
207
208 f = (papi_status_t (*)())psm_sym(svc, "papiJobStreamOpen");
209 if (f != NULL)
210 result = f(svc->svc_handle, svc->name, job_attributes,
211 job_ticket, stream);
212
213 return (result);
214 }
215
216 papi_status_t
papiJobStreamWrite(papi_service_t handle,papi_stream_t stream,void * buffer,size_t buflen)217 papiJobStreamWrite(papi_service_t handle,
218 papi_stream_t stream, void *buffer, size_t buflen)
219 {
220 papi_status_t result = PAPI_INTERNAL_ERROR;
221 service_t *svc = handle;
222 papi_status_t (*f)();
223
224 if ((svc == NULL) || (stream == NULL) || (buffer == NULL) ||
225 (buflen == 0))
226 return (PAPI_BAD_ARGUMENT);
227
228 f = (papi_status_t (*)())psm_sym(svc, "papiJobStreamWrite");
229 if (f != NULL)
230 result = f(svc->svc_handle, stream, buffer, buflen);
231
232 return (result);
233 }
234
235 papi_status_t
papiJobStreamClose(papi_service_t handle,papi_stream_t stream,papi_job_t * job)236 papiJobStreamClose(papi_service_t handle, papi_stream_t stream, papi_job_t *job)
237 {
238 papi_status_t result = PAPI_INTERNAL_ERROR;
239 service_t *svc = handle;
240 job_t *j = NULL;
241 papi_status_t (*f)();
242
243 if ((svc == NULL) || (stream == NULL) || (job == NULL))
244 return (PAPI_BAD_ARGUMENT);
245
246 if ((*job = j = calloc(1, sizeof (*j))) == NULL)
247 return (PAPI_TEMPORARY_ERROR);
248
249 j->svc = svc;
250 f = (papi_status_t (*)())psm_sym(j->svc, "papiJobStreamClose");
251 if (f != NULL)
252 result = f(svc->svc_handle, stream, &j->job);
253
254 return (result);
255 }
256
257 papi_status_t
papiJobQuery(papi_service_t handle,char * printer,int32_t job_id,char ** requested_attrs,papi_job_t * job)258 papiJobQuery(papi_service_t handle, char *printer, int32_t job_id,
259 char **requested_attrs, papi_job_t *job)
260 {
261 papi_status_t result = PAPI_INTERNAL_ERROR;
262 service_t *svc = handle;
263 job_t *j = NULL;
264 papi_status_t (*f)();
265
266 if ((svc == NULL) || (printer == NULL))
267 return (PAPI_BAD_ARGUMENT);
268
269 if ((result = service_connect(svc, printer)) != PAPI_OK)
270 return (result);
271
272 if ((*job = j = calloc(1, sizeof (*j))) == NULL)
273 return (PAPI_TEMPORARY_ERROR);
274
275 j->svc = svc;
276 f = (papi_status_t (*)())psm_sym(j->svc, "papiJobQuery");
277 if (f != NULL)
278 result = f(svc->svc_handle, svc->name, job_id,
279 requested_attrs, &j->job);
280
281 return (result);
282 }
283
284 papi_status_t
papiJobMove(papi_service_t handle,char * printer,int32_t job_id,char * destination)285 papiJobMove(papi_service_t handle, char *printer, int32_t job_id,
286 char *destination)
287 {
288 papi_status_t result = PAPI_INTERNAL_ERROR;
289 service_t *svc = handle;
290 papi_status_t (*f)();
291
292 if ((svc == NULL) || (printer == NULL) || (job_id < 0))
293 return (PAPI_BAD_ARGUMENT);
294
295 if ((result = service_connect(svc, printer)) != PAPI_OK)
296 return (result);
297
298 f = (papi_status_t (*)())psm_sym(svc, "papiJobMove");
299 if (f != NULL) {
300 papi_attribute_t **attrs = getprinterbyname(destination, NULL);
301
302 papiAttributeListGetString(attrs, NULL,
303 "printer-uri-supported", &destination);
304 result = f(svc->svc_handle, svc->name, job_id, destination);
305 papiAttributeListFree(attrs);
306 }
307
308 return (result);
309 }
310
311 /* common support for papiJob{Cancel|Release|Restart|Promote} */
312 static papi_status_t
_papi_job_handle_printer_id(papi_service_t handle,char * printer,int32_t job_id,char * function)313 _papi_job_handle_printer_id(papi_service_t handle,
314 char *printer, int32_t job_id, char *function)
315 {
316 papi_status_t result = PAPI_INTERNAL_ERROR;
317 service_t *svc = handle;
318 papi_status_t (*f)();
319
320 if ((svc == NULL) || (printer == NULL) || (job_id < 0))
321 return (PAPI_BAD_ARGUMENT);
322
323 if ((result = service_connect(svc, printer)) != PAPI_OK)
324 return (result);
325
326 f = (papi_status_t (*)())psm_sym(svc, function);
327 if (f != NULL)
328 result = f(svc->svc_handle, svc->name, job_id);
329
330 return (result);
331 }
332
333 papi_status_t
papiJobCancel(papi_service_t handle,char * printer,int32_t job_id)334 papiJobCancel(papi_service_t handle, char *printer, int32_t job_id)
335 {
336 return (_papi_job_handle_printer_id(handle, printer, job_id,
337 "papiJobCancel"));
338 }
339
340 papi_status_t
papiJobRelease(papi_service_t handle,char * printer,int32_t job_id)341 papiJobRelease(papi_service_t handle, char *printer, int32_t job_id)
342 {
343 return (_papi_job_handle_printer_id(handle, printer, job_id,
344 "papiJobRelease"));
345 }
346
347 papi_status_t
papiJobRestart(papi_service_t handle,char * printer,int32_t job_id)348 papiJobRestart(papi_service_t handle, char *printer, int32_t job_id)
349 {
350 return (_papi_job_handle_printer_id(handle, printer, job_id,
351 "papiJobRestart"));
352 }
353
354 papi_status_t
papiJobPromote(papi_service_t handle,char * printer,int32_t job_id)355 papiJobPromote(papi_service_t handle, char *printer, int32_t job_id)
356 {
357 return (_papi_job_handle_printer_id(handle, printer, job_id,
358 "papiJobPromote"));
359 }
360
361 papi_status_t
papiJobCommit(papi_service_t handle,char * printer,int32_t job_id)362 papiJobCommit(papi_service_t handle, char *printer, int32_t job_id)
363 {
364 return (_papi_job_handle_printer_id(handle, printer, job_id,
365 "papiJobCommit"));
366 }
367
368 papi_status_t
papiJobHold(papi_service_t handle,char * printer,int32_t job_id)369 papiJobHold(papi_service_t handle, char *printer, int32_t job_id)
370 {
371 return (_papi_job_handle_printer_id(handle, printer, job_id,
372 "papiJobHold"));
373 }
374
375 papi_status_t
papiJobModify(papi_service_t handle,char * printer,int32_t job_id,papi_attribute_t ** attributes,papi_job_t * job)376 papiJobModify(papi_service_t handle, char *printer, int32_t job_id,
377 papi_attribute_t **attributes, papi_job_t *job)
378 {
379 papi_status_t result = PAPI_INTERNAL_ERROR;
380 service_t *svc = handle;
381 job_t *j = NULL;
382 papi_status_t (*f)();
383
384 if ((svc == NULL) || (printer == NULL) || (job_id < 0) ||
385 (attributes == NULL))
386 return (PAPI_BAD_ARGUMENT);
387
388 if ((result = service_connect(svc, printer)) != PAPI_OK)
389 return (result);
390
391 if ((*job = j = calloc(1, sizeof (*j))) == NULL)
392 return (PAPI_TEMPORARY_ERROR);
393
394 j->svc = svc;
395 f = (papi_status_t (*)())psm_sym(j->svc, "papiJobModify");
396 if (f != NULL)
397 result = f(svc->svc_handle, svc->name, job_id, attributes,
398 &j->job);
399
400 return (result);
401 }
402
403 /*
404 * The functions defined below are private to Solaris. They are here
405 * temporarily, until equivalent functionality makes it's way into the PAPI
406 * spec. This is expected in the next minor version after v1.0.
407 */
408 papi_status_t
papiJobCreate(papi_service_t handle,char * printer,papi_attribute_t ** job_attributes,papi_job_ticket_t * job_ticket,papi_job_t * job)409 papiJobCreate(papi_service_t handle, char *printer,
410 papi_attribute_t **job_attributes,
411 papi_job_ticket_t *job_ticket, papi_job_t *job)
412 {
413 papi_status_t result = PAPI_INTERNAL_ERROR;
414 service_t *svc = handle;
415 job_t *j = NULL;
416 papi_status_t (*f)();
417
418 if ((svc == NULL) || (printer == NULL) || (job == NULL))
419 return (PAPI_BAD_ARGUMENT);
420
421 if ((result = service_connect(svc, printer)) != PAPI_OK)
422 return (result);
423
424 if ((*job = j = calloc(1, sizeof (*j))) == NULL)
425 return (PAPI_TEMPORARY_ERROR);
426
427 j->svc = svc;
428 f = (papi_status_t (*)())psm_sym(j->svc, "papiJobCreate");
429 if (f != NULL)
430 result = f(svc->svc_handle, svc->name, job_attributes,
431 job_ticket, &j->job);
432
433 return (result);
434 }
435
436 papi_status_t
papiJobStreamAdd(papi_service_t handle,char * printer,int32_t id,papi_stream_t * stream)437 papiJobStreamAdd(papi_service_t handle, char *printer, int32_t id,
438 papi_stream_t *stream)
439 {
440 papi_status_t result = PAPI_INTERNAL_ERROR;
441 service_t *svc = handle;
442 papi_status_t (*f)();
443
444 if ((svc == NULL) || (printer == NULL))
445 return (PAPI_BAD_ARGUMENT);
446
447 if ((result = service_connect(svc, printer)) != PAPI_OK)
448 return (result);
449
450 f = (papi_status_t (*)())psm_sym(svc, "papiJobStreamAdd");
451 if (f != NULL)
452 result = f(svc->svc_handle, svc->name, id, stream);
453
454 return (result);
455 }
456