papi_status_t papiJobQuery(papi_service_t handle, char *printer, int32_t job_id, char **requested_attrs, papi_job_t *job) { service_t *svc = handle; job_t *j; char *dest; char req_id[32]; short rc; char *form = NULL, *request_id = NULL, *charset = NULL, *user = NULL, *slabel = NULL, *file = NULL; time_t date = 0; size_t size = 0; short rank = 0, state = 0; if ((handle == NULL) || (printer == NULL) || (job_id < 0)) return (PAPI_BAD_ARGUMENT); dest = printer_name_from_uri_id(printer, job_id); snprintf(req_id, sizeof (req_id), "%s-%d", dest, job_id); free(dest); rc = snd_msg(svc, S_INQUIRE_REQUEST_RANK, 0, "", "", req_id, "", ""); if (rc < 0) return (PAPI_SERVICE_UNAVAILABLE); if (rcv_msg(svc, R_INQUIRE_REQUEST_RANK, &rc, &request_id, &user, &slabel, &size, &date, &state, &dest, &form, &charset, &rank, &file) < 0) { detailed_error(svc, gettext("failed to read response from scheduler")); return (PAPI_DEVICE_ERROR); } if ((request_id == NULL) || (request_id[0] == NULL)) return (PAPI_NOT_FOUND); if ((*job = j = calloc(1, sizeof (*j))) == NULL) return (PAPI_TEMPORARY_ERROR); snprintf(req_id, sizeof (req_id), "%d-0", job_id); lpsched_read_job_configuration(svc, j, req_id); job_status_to_attributes(j, request_id, user, slabel, size, date, state, dest, form, charset, rank, file); return (PAPI_OK); }
papi_status_t papiPrinterListJobs(papi_service_t handle, char *name, char **requested_attrs, int type_mask, int max_num_jobs, papi_job_t **jobs) { service_t *svc = handle; char *dest; short rc; int count = 1; if ((handle == NULL) || (name == NULL) || (jobs == NULL)) return (PAPI_BAD_ARGUMENT); dest = printer_name_from_uri_id(name, -1); rc = snd_msg(svc, S_INQUIRE_REQUEST_RANK, 0, "", dest, "", "", ""); free(dest); if (rc < 0) return (PAPI_SERVICE_UNAVAILABLE); do { job_t *job = NULL; char *dest = NULL, *ptr, *form = NULL, *req_id = NULL, *charset = NULL, *owner = NULL, *slabel = NULL, *file = NULL; time_t date = 0; size_t size = 0; short rank = 0, state = 0; if (rcv_msg(svc, R_INQUIRE_REQUEST_RANK, &rc, &req_id, &owner, &slabel, &size, &date, &state, &dest, &form, &charset, &rank, &file) < 0) return (PAPI_SERVICE_UNAVAILABLE); if ((rc != MOK) && (rc != MOKMORE)) continue; /* * at this point, we should check to see if the job matches the * selection criterion defined in "type_mask". */ /* too many yet? */ if ((max_num_jobs != 0) && (count++ > max_num_jobs)) continue; if ((job = calloc(1, sizeof (*job))) == NULL) continue; job_status_to_attributes(job, req_id, owner, slabel, size, date, state, dest, form, charset, rank, file); if ((ptr = strrchr(file, '-')) != NULL) { *++ptr = '0'; *++ptr = NULL; } lpsched_read_job_configuration(svc, job, file); list_append(jobs, job); } while (rc == MOKMORE); if (rc == MNOINFO) /* If no jobs are found, it's still ok */ rc = MOK; return (lpsched_status_to_papi_status(rc)); }