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)