1 '\" te
   2 .\" Copyright (c) 2007, Sun Microsystems, Inc.  All Rights Reserved.
   3 .\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License").  You may not use this file except in compliance with the License.
   4 .\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing.  See the License for the specific language governing permissions and limitations under the License.
   5 .\" When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE.  If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
   6 .TH PAPIJOBSUBMIT 3PAPI "Jan 17, 2007"
   7 .SH NAME
   8 papiJobSubmit, papiJobSubmitByReference, papiJobValidate, papiJobStreamOpen,
   9 papiJobStreamWrite, papiJobStreamClose, papiJobQuery, papiJobModify,
  10 papiJobMove, papiJobCancel, papiJobHold, papiJobRelease, papiJobRestart,
  11 papiJobPromote, papiJobGetAttributeList, papiJobGetPrinterName, papiJobGetId,
  12 papiJobGetJobTicket, papiJobFree, papiJobListFree \- job object manipulation
  13 .SH SYNOPSIS
  14 .LP
  15 .nf
  16 cc [ \fIflag\fR\&.\|.\|. ] \fIfile\fR\&.\|.\|. \fB-lpapi\fR [ \fIlibrary\fR\&.\|.\|. ]
  17 #include <papi.h>
  18 
  19 \fBpapi_status_t\fR \fBpapiJobSubmit\fR(\fBpapi_service_t\fR \fIhandle\fR,
  20      \fBchar *\fR\fIprinter\fR, \fBpapi_attribute_t **\fR\fIjob_attributes\fR,
  21      \fBpapi_job_ticket_t *\fR\fIjob_ticket\fR, \fBchar **\fR\fIfiles\fR,
  22      \fBpapi_job_t *\fR\fIjob\fR);
  23 .fi
  24 
  25 .LP
  26 .nf
  27 \fBpapi_status_t\fR \fBpapiJobSubmitByReference\fR(\fBpapi_service_t\fR \fIhandle\fR,
  28      \fBchar *\fR\fIprinter\fR, \fBpapi_attribute_t **\fR\fIjob_attributes\fR,
  29      \fBpapi_job_ticket_t *\fR\fIjob_ticket\fR, \fBchar **\fR\fIfiles\fR,
  30      \fBpapi_job_t *\fR\fIjob\fR);
  31 .fi
  32 
  33 .LP
  34 .nf
  35 \fBpapi_status_t\fR \fBpapiJobValidate\fR(\fBpapi_service_t\fR \fIhandle\fR,
  36      \fBchar *\fR\fIprinter\fR, \fBpapi_attribute_t **\fR\fIjob_attributes\fR,
  37      \fBpapi_job_ticket_t *\fR\fIjob_ticket\fR, \fBchar **\fR\fIfiles\fR,
  38      \fBpapi_job_t *\fR\fIjob\fR);
  39 .fi
  40 
  41 .LP
  42 .nf
  43 \fBpapi_status_t\fR \fBpapiJobStreamOpen\fR(\fBpapi_service_t\fR \fIhandle\fR,
  44      \fBchar *\fR\fIprinter\fR, \fBpapi_attribute_t **\fR\fIjob_attributes\fR,
  45      \fBpapi_job_ticket_t *\fR\fIjob_ticket\fR, \fBpapi_stream_t *\fR\fIstream\fR);
  46 .fi
  47 
  48 .LP
  49 .nf
  50 \fBpapi_status_t\fR \fBpapiJobStreamWrite\fR(\fBpapi_service_t\fR \fIhandle\fR,
  51      \fBpapi_stream_t\fR \fIstream\fR, \fBvoid *\fR\fIbuffer\fR, \fBsize_t\fR \fIbuflen\fR);
  52 .fi
  53 
  54 .LP
  55 .nf
  56 \fBpapi_status_t\fR \fBpapiJobStreamClose\fR(\fBpapi_service_t\fR \fIhandle\fR,
  57      \fBpapi_stream_t\fR \fIstream\fR, \fBpapi_job_t *\fR\fIjob\fR);
  58 .fi
  59 
  60 .LP
  61 .nf
  62 \fBpapi_status_t\fR \fBpapiJobQuery\fR(\fBpapi_service_t\fR \fIhandle\fR,
  63      \fBchar *\fR\fIprinter\fR, \fBint32_t\fR \fIjob_id\fR, \fBchar **\fR\fIrequested_attrs\fR,
  64      \fBpapi_job_t *\fR\fIjob\fR);
  65 .fi
  66 
  67 .LP
  68 .nf
  69 \fBpapi_status_t\fR \fBpapiJobModify\fR(\fBpapi_service_t\fR \fIhandle\fR,
  70      \fBchar *\fR\fIprinter\fR, \fBint32_t\fR \fIjob_id\fR,
  71      \fBpapi_attribute_t **\fR\fIattributes\fR, \fBpapi_job_t *\fR\fIjob\fR);
  72 .fi
  73 
  74 .LP
  75 .nf
  76 \fBpapi_status_t\fR \fBpapiJobMove\fR(\fBpapi_service_t\fR \fIhandle\fR,
  77      \fBchar *\fR\fIprinter\fR, \fBint32_t\fR \fIjob_id\fR, \fBchar *\fR\fIdestination\fR);
  78 .fi
  79 
  80 .LP
  81 .nf
  82 \fBpapi_status_t\fR \fBpapiJobCancel\fR(\fBpapi_service_t\fR \fIhandle\fR,
  83      \fBchar *\fR\fIprinter\fR, \fBint32_t\fR \fIjob_id\fR);
  84 .fi
  85 
  86 .LP
  87 .nf
  88 \fBpapi_status_t\fR \fBpapiJobHold\fR(\fBpapi_service_t\fR \fIhandle\fR,
  89      \fBchar *\fR\fIprinter\fR, \fBint32_t\fR \fIjob_id\fR);
  90 .fi
  91 
  92 .LP
  93 .nf
  94 \fBpapi_status_t\fR \fBpapiJobRelease\fR(\fBpapi_service_t\fR \fIhandle\fR,
  95      \fBchar *\fR\fIprinter\fR, \fBint32_t\fR \fIjob_id\fR);
  96 .fi
  97 
  98 .LP
  99 .nf
 100 \fBpapi_status_t\fR \fBpapiJobRestart\fR(\fBpapi_service_t\fR \fIhandle\fR,
 101      \fBchar *\fR\fIprinter\fR, \fBint32_t\fR \fIjob_id\fR);
 102 .fi
 103 
 104 .LP
 105 .nf
 106 \fBpapi_status_t\fR \fBpapiJobPromote\fR(\fBpapi_service_t\fR \fIhandle\fR,
 107      \fBchar *\fR\fIprinter\fR, \fBint32_t\fR \fIjob_id\fR);
 108 .fi
 109 
 110 .LP
 111 .nf
 112 \fBpapi_attribute_t **\fR\fBpapiJobGetAttributeList\fR(\fBpapi_job_t\fR \fIjob\fR);
 113 .fi
 114 
 115 .LP
 116 .nf
 117 \fBchar *\fR\fBpapiJobGetPrinterName\fR(\fBpapi_job_t\fR \fIjob\fR);
 118 .fi
 119 
 120 .LP
 121 .nf
 122 \fBint32_t\fR \fBpapiJobGetId\fR(\fBpapi_job_t\fR \fIjob\fR);
 123 .fi
 124 
 125 .LP
 126 .nf
 127 \fBpapi_job_ticket_t *\fR\fBpapiJobGetJobTicket\fR(\fBpapi_job_t\fR \fIjob\fR);
 128 .fi
 129 
 130 .LP
 131 .nf
 132 \fBvoid\fR \fBpapiJobFree\fR(\fBpapi_job_t\fR \fIjob\fR);
 133 .fi
 134 
 135 .LP
 136 .nf
 137 \fBvoid\fR \fBpapiJobListFree\fR(\fBpapi_job_t *\fR\fIjobs\fR);
 138 .fi
 139 
 140 .SH PARAMETERS
 141 .sp
 142 .ne 2
 143 .na
 144 \fB\fIattributes\fR\fR
 145 .ad
 146 .RS 19n
 147 a set of attributes to be applied to a printer object
 148 .RE
 149 
 150 .sp
 151 .ne 2
 152 .na
 153 \fB\fIbuffer\fR\fR
 154 .ad
 155 .RS 19n
 156 a buffer of data to be written to the job stream
 157 .RE
 158 
 159 .sp
 160 .ne 2
 161 .na
 162 \fB\fIbufflen\fR\fR
 163 .ad
 164 .RS 19n
 165 the size of the supplied buffer
 166 .RE
 167 
 168 .sp
 169 .ne 2
 170 .na
 171 \fB\fIdestination\fR\fR
 172 .ad
 173 .RS 19n
 174 the name of the printer where a print job should be relocated, which must
 175 reside within the same print services as the job is currently queued
 176 .RE
 177 
 178 .sp
 179 .ne 2
 180 .na
 181 \fB\fIfiles\fR\fR
 182 .ad
 183 .RS 19n
 184 files to use during job submission
 185 .RE
 186 
 187 .sp
 188 .ne 2
 189 .na
 190 \fB\fIhandle\fR\fR
 191 .ad
 192 .RS 19n
 193 a pointer to a handle to be used for all PAPI operations that is created by
 194 calling \fBpapiServiceCreate()\fR
 195 .RE
 196 
 197 .sp
 198 .ne 2
 199 .na
 200 \fB\fIjob\fR\fR
 201 .ad
 202 .RS 19n
 203 a pointer to a printer object (initialized to NULL) to be filled in by
 204 \fBpapiJobQuery()\fR, \fBpapiJobSubmit()\fR, \fBpapiJobSubmitByReference()\fR,
 205 \fBpapiJobValidate()\fR, \fBpapiJobStreamClose()\fR, and \fBpapiJobModify()\fR
 206 .RE
 207 
 208 .sp
 209 .ne 2
 210 .na
 211 \fB\fIjob_attributes\fR\fR
 212 .ad
 213 .RS 19n
 214 attributes to apply during job creation or modification
 215 .RE
 216 
 217 .sp
 218 .ne 2
 219 .na
 220 \fB\fIjob_id\fR\fR
 221 .ad
 222 .RS 19n
 223 ID number of the job reported on or manipulated
 224 .RE
 225 
 226 .sp
 227 .ne 2
 228 .na
 229 \fB\fIjob_ticket\fR\fR
 230 .ad
 231 .RS 19n
 232 unused
 233 .RE
 234 
 235 .sp
 236 .ne 2
 237 .na
 238 \fB\fIjobs\fR\fR
 239 .ad
 240 .RS 19n
 241 a list of job objects returned by \fBpapiPrinterListJobs()\fR or
 242 \fBpapiPrinterPurgeJobs()\fR
 243 .RE
 244 
 245 .sp
 246 .ne 2
 247 .na
 248 \fB\fIprinter\fR\fR
 249 .ad
 250 .RS 19n
 251 name of the printer where the job is or should reside
 252 .RE
 253 
 254 .sp
 255 .ne 2
 256 .na
 257 \fB\fIrequested_attrs\fR\fR
 258 .ad
 259 .RS 19n
 260 a null-terminated array of pointers to attribute names requested during job
 261 enumeration (\fBpapiPrinterListJobs()\fR) or job query (\fBpapiJobQuery()\fR)
 262 .RE
 263 
 264 .sp
 265 .ne 2
 266 .na
 267 \fB\fIstream\fR\fR
 268 .ad
 269 .RS 19n
 270 a communication endpoint for sending print job data
 271 .RE
 272 
 273 .SH DESCRIPTION
 274 .sp
 275 .LP
 276 The \fBpapiJobSubmit()\fR function creates a print job containing the passed in
 277 files with the supplied attributes.  When the function returns, the data in the
 278 passed files will have been copied by the print service. A job object is
 279 returned that reflects the state of the job.
 280 .sp
 281 .LP
 282 The \fBpapiJobSubmitByReference()\fR function creates a print job containing
 283 the passed in files with the supplied attributes.  When the function returns,
 284 the data in the passed files might have been copied by the print service. A job
 285 object is returned that reflects the state of the job.
 286 .sp
 287 .LP
 288 The \fBpapiJobStreamOpen()\fR, \fBpapiJobStreamWrite()\fR,
 289 \fBpapiJobStreamClose()\fR functions create a print job by opening a stream,
 290 writing to the stream, and closing it.
 291 .sp
 292 .LP
 293 The \fBpapiJobValidate()\fR function validates that the supplied attributes and
 294 files will result in a valid print job.
 295 .sp
 296 .LP
 297 The \fBpapiJobQuery()\fR function retrieves job information from the print
 298 service.
 299 .sp
 300 .LP
 301 The \fBpapiJobModify()\fR function modifies a queued job according to the
 302 attribute list passed into the call.  A job object is returned that reflects
 303 the state of the job after the modification has been applied.
 304 .sp
 305 .LP
 306 The \fBpapiJobMove()\fR function moves a job from its current queue to the
 307 named destination within the same print service.
 308 .sp
 309 .LP
 310 The \fBpapiJobCancel()\fR function removes a job from the queue.
 311 .sp
 312 .LP
 313 The \fBpapiJobHold()\fR and \fBpapiJobRelease()\fR functions set the job state
 314 to "held" or "idle" to indicate whether the job is eligible for processing.
 315 .sp
 316 .LP
 317 The \fBpapiJobRestart()\fR function restarts processing of a currently queued
 318 print job.
 319 .sp
 320 .LP
 321 The \fBpapiJobGetAttributeList()\fR function returns a list of attributes
 322 describing the job. This list can be searched and/or enumerated using
 323 \fBpapiAttributeList*()\fR calls. See \fBpapiAttributeListAddValue\fR(3PAPI).
 324 .sp
 325 .LP
 326 The \fBpapiJobGetPrinterName()\fR function returns the name of the queue where
 327 the job is currently queued.
 328 .sp
 329 .LP
 330 The \fBpapiJobGetId()\fR function returns a job identifier number from the job
 331 object passed in.
 332 .sp
 333 .LP
 334 The \fBpapiJobPromote()\fR function moves a job to the head of the print queue.
 335 .sp
 336 .LP
 337 The \fBpapiJobGetJobTicket()\fR function retrieves a pointer to a job ticket
 338 associated with the job object.
 339 .sp
 340 .LP
 341 The \fBpapiJobFree()\fR and \fBpapiJobListFree()\fR functions deallocate memory
 342 allocated for the return of printer object(s) from functions that return
 343 printer objects.
 344 .SH RETURN VALUES
 345 .sp
 346 .LP
 347 Upon successful completion, all \fBpapiJob*()\fR functions that return a value
 348 return \fBPAPI_OK\fR. Otherwise, they return an appropriate \fBpapi_status_t\fR
 349 indicating the type of failure.
 350 .sp
 351 .LP
 352 Upon successful completion, \fBpapiJobGetAttributeList()\fR returns a pointer
 353 to the requested data. Otherwise, it returns \fINULL\fR.
 354 .SH EXAMPLES
 355 .LP
 356 \fBExample 1 \fREnumerate all jobs in a queue
 357 .sp
 358 .in +2
 359 .nf
 360 /*
 361  * program to enumerate queued jobs using PAPI interfaces.
 362  */
 363 #include <stdio.h>
 364 #include <stdlib.h>
 365 #include <unistd.h>
 366 #include <libintl.h>
 367 #include <pwd.h>
 368 #include <papi.h>
 369 
 370 static int
 371 authCB(papi_service_t svc, void *app_data)
 372 {
 373     char prompt[BUFSIZ];
 374     char *user, *svc_name, *passphrase;
 375 
 376     /* get the name of the service we are contacting */
 377     if ((svc_name = papiServiceGetServiceName(svc)) == NULL)
 378             return (-1);
 379 
 380     /* find out who we are supposed to be */
 381     if ((user = papiServiceGetUserName(svc)) == NULL) {
 382             struct passwd *pw;
 383 
 384             if ((pw = getpwuid(getuid())) != NULL)
 385                     user = pw->pw_name;
 386             else
 387                     user = "nobody";
 388     }
 389 
 390     /* build the prompt string */
 391     snprintf(prompt, sizeof (prompt),
 392             gettext("passphrase for %s to access %s: "), user,
 393                   svc_name);
 394 
 395     /* ask for the passphrase */
 396     if ((passphrase = getpassphrase(prompt)) != NULL)
 397             papiServiceSetPassword(svc, passphrase);
 398 
 399     return (0);
 400 }
 401 
 402 /*ARGSUSED*/
 403 int
 404 main(int ac, char *av[])
 405 {
 406     papi_status_t status;
 407     papi_service_t svc = NULL;
 408     papi_job_t *jobs = NULL;
 409     char *svc_name = NULL;
 410     char *pname = "unknown";
 411     int c;
 412 
 413     while ((c = getopt(ac, av, "s:p:")) != EOF)
 414         switch (c) {
 415         case 's':
 416             svc_name = optarg;
 417             break;
 418         case 'p':
 419             pname = optarg;
 420             break;
 421         }
 422 
 423     status = papiServiceCreate(&svc, svc_name, NULL, NULL, authCB,
 424                             PAPI_ENCRYPT_NEVER, NULL);
 425 
 426     if (status != PAPI_OK) {
 427         printf("papiServiceCreate(%s): %s\n", svc_name ? svc_name :
 428                      "NULL", papiStatusString(status));
 429         papiServiceDestroy(svc);
 430         exit(1);
 431     }
 432 
 433     status = papiPrinterListJobs(svc, pname, NULL, 0, 0, &jobs);
 434     if (status != PAPI_OK) {
 435         printf("papiPrinterListJobs(%s): %s\n", pname,
 436                     papiStatusString(status));
 437         papiServiceDestroy(svc);
 438         exit(1);
 439     }
 440 
 441     if (jobs != NULL) {
 442         int i;
 443 
 444         for (i = 0; jobs[i] != NULL; i++) {
 445             papi_attribute_t **list = papiJobGetAttributeList(jobs[i]);
 446 
 447             if (list != NULL) {
 448                 char *name = "unknown";
 449                             int32_t id = 0;
 450                 char *buffer = NULL;
 451                 size_t size = 0;
 452 
 453                (void) papiAttributeListGetString(list, NULL,
 454                                     "printer-name", &name);
 455                (void) papiAttributeListGetInteger(list, NULL,
 456                                     "job-id", &id);
 457                 while (papiAttributeListToString(list, "\n\t", buffer,
 458                             size) != PAPI_OK)
 459                     buffer = realloc(buffer, size += BUFSIZ);
 460 
 461                 printf("%s-%d:\n\t%s\n", name, id, buffer);
 462                 free(buffer);
 463             }
 464         }
 465         papiJobListFree(jobs);
 466     }
 467 
 468     papiServiceDestroy(svc);
 469 
 470     exit(0);
 471 }
 472 .fi
 473 .in -2
 474 
 475 .LP
 476 \fBExample 2 \fRDump all job attributes.
 477 .sp
 478 .in +2
 479 .nf
 480 /*
 481  * program to dump a queued job's attributes using PAPI interfaces.
 482  */
 483 #include <stdio.h>
 484 #include <stdlib.h>
 485 #include <unistd.h>
 486 #include <libintl.h>
 487 #include <pwd.h>
 488 #include <papi.h>
 489 
 490 static int
 491 authCB(papi_service_t svc, void *app_data)
 492 {
 493     char prompt[BUFSIZ];
 494     char *user, *svc_name, *passphrase;
 495 
 496     /* get the name of the service we are contacting */
 497     if ((svc_name = papiServiceGetServiceName(svc)) == NULL)
 498             return (-1);
 499 
 500     /* find out who we are supposed to be */
 501     if ((user = papiServiceGetUserName(svc)) == NULL) {
 502             struct passwd *pw;
 503 
 504             if ((pw = getpwuid(getuid())) != NULL)
 505                     user = pw->pw_name;
 506             else
 507                     user = "nobody";
 508     }
 509 
 510     /* build the prompt string */
 511     snprintf(prompt, sizeof (prompt),
 512             gettext("passphrase for %s to access %s: "), user,
 513                      svc_name);
 514 
 515     /* ask for the passphrase */
 516     if ((passphrase = getpassphrase(prompt)) != NULL)
 517             papiServiceSetPassword(svc, passphrase);
 518 
 519     return (0);
 520 }
 521 
 522 /*ARGSUSED*/
 523 int
 524 main(int ac, char *av[])
 525 {
 526     papi_status_t status;
 527     papi_service_t svc = NULL;
 528     papi_job_t job = NULL;
 529     char *svc_name = NULL;
 530     char *pname = "unknown";
 531     int id = 0;
 532     int c;
 533 
 534     while ((c = getopt(ac, av, "s:p:j:")) != EOF)
 535         switch (c) {
 536         case 's':
 537             svc_name = optarg;
 538             break;
 539         case 'p':
 540             pname = optarg;
 541             break;
 542         case 'j':
 543             id = atoi(optarg);
 544             break;
 545         }
 546 
 547     status = papiServiceCreate(&svc, svc_name, NULL, NULL, authCB,
 548                             PAPI_ENCRYPT_NEVER, NULL);
 549 
 550     if (status != PAPI_OK) {
 551         printf("papiServiceCreate(%s): %s\n", svc_name ? svc_name :
 552                      "NULL", papiStatusString(status));
 553         papiServiceDestroy(svc);
 554         exit(1);
 555     }
 556 
 557     status = papiJobQuery(svc, pname, id, NULL, &job);
 558     if ((status == PAPI_OK) && (job != NULL)) {
 559         papi_attribute_t **list = papiJobGetAttributeList(job);
 560 
 561         if (list != NULL) {
 562             char *name = "unknown";
 563             int32_t id = 0;
 564             char *buffer = NULL;
 565             size_t size = 0;
 566 
 567             (void) papiAttributeListGetString(list, NULL,
 568                                     "printer-name", &name);
 569             (void) papiAttributeListGetInteger(list, NULL,
 570                                     "job-id", &id);
 571             while (papiAttributeListToString(list, "\n\t", buffer, size)
 572                             != PAPI_OK)
 573                 buffer = realloc(buffer, size += BUFSIZ);
 574 
 575             printf("%s-%d:\n\t%s\n", name, id, buffer);
 576             free(buffer);
 577         }
 578     } else
 579         printf("papiJobQuery(%s-%d): %s\n", pname, id,
 580                     papiStatusString(status));
 581 
 582     papiJobFree(job);
 583     papiServiceDestroy(svc);
 584 
 585     exit(0);
 586 }
 587 .fi
 588 .in -2
 589 
 590 .LP
 591 \fBExample 3 \fRSubmit a job (stream).
 592 .sp
 593 .in +2
 594 .nf
 595 /*
 596  * program to submit a job from standard input.
 597  */
 598 #include <stdio.h>
 599 #include <stdlib.h>
 600 #include <unistd.h>
 601 #include <libintl.h>
 602 #include <pwd.h>
 603 #include <papi.h>
 604 
 605 static int
 606 authCB(papi_service_t svc, void *app_data)
 607 {
 608     char prompt[BUFSIZ];
 609     char *user, *svc_name, *passphrase;
 610 
 611     /* get the name of the service we are contacting */
 612     if ((svc_name = papiServiceGetServiceName(svc)) == NULL)
 613             return (-1);
 614 
 615     /* find out who we are supposed to be */
 616     if ((user = papiServiceGetUserName(svc)) == NULL) {
 617             struct passwd *pw;
 618 
 619             if ((pw = getpwuid(getuid())) != NULL)
 620                     user = pw->pw_name;
 621             else
 622                     user = "nobody";
 623     }
 624 
 625     /* build the prompt string */
 626     snprintf(prompt, sizeof (prompt),
 627             gettext("passphrase for %s to access %s: "), user,
 628                     svc_name);
 629 
 630     /* ask for the passphrase */
 631     if ((passphrase = getpassphrase(prompt)) != NULL)
 632             papiServiceSetPassword(svc, passphrase);
 633 
 634     return (0);
 635 }
 636 
 637 /*ARGSUSED*/
 638 int
 639 main(int ac, char *av[])
 640 {
 641     papi_status_t status;
 642     papi_service_t svc = NULL;
 643     papi_stream_t stream = NULL;
 644     papi_job_t job = NULL;
 645     papi_attribute_t **attrs = NULL;
 646     char *svc_name = NULL;
 647     char *pname = "unknown";
 648     int id = 0;
 649     int c;
 650     int rc;
 651     char buf[BUFSIZ];
 652 
 653     while ((c = getopt(ac, av, "s:p:")) != EOF)
 654         switch (c) {
 655         case 's':
 656             svc_name = optarg;
 657             break;
 658         case 'p':
 659             pname = optarg;
 660             break;
 661         }
 662 
 663     status = papiServiceCreate(&svc, svc_name, NULL, NULL, authCB,
 664                             PAPI_ENCRYPT_NEVER, NULL);
 665 
 666     if (status != PAPI_OK) {
 667         printf("papiServiceCreate(%s): %s\n", svc_name ? svc_name :
 668                     "NULL", papiStatusString(status));
 669         papiServiceDestroy(svc);
 670         exit(1);
 671     }
 672 
 673     papiAttributeListAddInteger(&attrs, PAPI_ATTR_EXCL, "copies", 1);
 674     papiAttributeListAddString(&attrs, PAPI_ATTR_EXCL,
 675                 "document-format", "application/octet-stream");
 676     papiAttributeListAddString(&attrs, PAPI_ATTR_EXCL,
 677                 "job-title", "Standard Input");
 678 
 679     status = papiJobStreamOpen(svc, pname, attrs, NULL, &stream);
 680     while ((status == PAPI_OK) && ((rc = read(0, buf,
 681                      sizeof (buf))) > 0))
 682             status = papiJobStreamWrite(svc, stream, buf, rc);
 683 
 684     if (status == PAPI_OK)
 685             status = papiJobStreamClose(svc, stream, &job);
 686 
 687 
 688     if ((status == PAPI_OK) && (job != NULL)) {
 689         papi_attribute_t **list = papiJobGetAttributeList(job);
 690 
 691         if (list != NULL) {
 692             char *name = "unknown";
 693             int32_t id = 0;
 694             char *buffer = NULL;
 695             size_t size = 0;
 696 
 697             (void) papiAttributeListGetString(list, NULL,
 698                                     "printer-name", &name);
 699             (void) papiAttributeListGetInteger(list, NULL,
 700                                     "job-id", &id);
 701             while (papiAttributeListToString(list, "\n\t", buffer, size)
 702                             != PAPI_OK)
 703                 buffer = realloc(buffer, size += BUFSIZ);
 704 
 705             printf("%s-%d:\n\t%s\n", name, id, buffer);
 706             free(buffer);
 707         }
 708     } else
 709         printf("papiJobStream*(%s-%d): %s\n", pname, id,
 710                     papiStatusString(status));
 711 
 712     papiJobFree(job);
 713     papiServiceDestroy(svc);
 714 
 715     exit(0);
 716 }
 717 .fi
 718 .in -2
 719 
 720 .SH ATTRIBUTES
 721 .sp
 722 .LP
 723 See \fBattributes\fR(5) for descriptions of the following attributes:
 724 .sp
 725 
 726 .sp
 727 .TS
 728 box;
 729 c | c
 730 l | l .
 731 ATTRIBUTE TYPE  ATTRIBUTE VALUE
 732 _
 733 Interface Stability     Volatile
 734 _
 735 MT-Level        Safe
 736 .TE
 737 
 738 .SH SEE ALSO
 739 .sp
 740 .LP
 741 \fBlibpapi\fR(3LIB), \fBpapiAttributeListAddValue\fR(3PAPI),
 742 \fBattributes\fR(5)