diff options
Diffstat (limited to 'source3/printing/print_iprint.c')
-rw-r--r-- | source3/printing/print_iprint.c | 244 |
1 files changed, 143 insertions, 101 deletions
diff --git a/source3/printing/print_iprint.c b/source3/printing/print_iprint.c index 62073ddf89..7cb1999779 100644 --- a/source3/printing/print_iprint.c +++ b/source3/printing/print_iprint.c @@ -34,6 +34,49 @@ #define NOVELL_SERVER_VERSION_STRING "iprintserverversion=" #define NOVELL_SERVER_VERSION_OES_SP1 33554432 +#if (CUPS_VERSION_MAJOR > 1) || (CUPS_VERSION_MINOR > 5) +#define HAVE_CUPS_1_6 1 +#endif + +#ifndef HAVE_CUPS_1_6 +#define ippGetCount(attr) attr->num_values +#define ippGetGroupTag(attr) attr->group_tag +#define ippGetName(attr) attr->name +#define ippGetValueTag(attr) attr->value_tag +#define ippGetStatusCode(ipp) ipp->request.status.status_code +#define ippGetBoolean(attr, element) attr->values[element].boolean +#define ippGetInteger(attr, element) attr->values[element].integer +#define ippGetString(attr, element, language) attr->values[element].string.text + +static ipp_attribute_t * +ippFirstAttribute(ipp_t *ipp) +{ + if (!ipp) + return (NULL); + return (ipp->current = ipp->attrs); +} + +static ipp_attribute_t * +ippNextAttribute(ipp_t *ipp) +{ + if (!ipp || !ipp->current) + return (NULL); + return (ipp->current = ipp->current->next); +} + +static int ippSetOperation(ipp_t *ipp, ipp_op_t op) +{ + ipp->request.op.operation_id = op; + return (1); +} + +static int ippSetRequestId(ipp_t *ipp, int request_id) +{ + ipp->request.any.request_id = request_id; + return (1); +} +#endif + /* * 'iprint_passwd_cb()' - The iPrint password callback... */ @@ -94,8 +137,8 @@ static int iprint_get_server_version(http_t *http, char* serviceUri) request = ippNew(); - request->request.op.operation_id = (ipp_op_t)OPERATION_NOVELL_MGMT; - request->request.op.request_id = 1; + ippSetOperation(request, (ipp_op_t)OPERATION_NOVELL_MGMT); + ippSetRequestId(request, 1); language = cupsLangDefault(); @@ -116,12 +159,12 @@ static int iprint_get_server_version(http_t *http, char* serviceUri) */ if (((response = cupsDoRequest(http, request, "/ipp/")) == NULL) || - (response->request.status.status_code >= IPP_OK_CONFLICT)) + (ippGetStatusCode(response) >= IPP_OK_CONFLICT)) goto out; if (((attr = ippFindAttribute(response, "server-version", IPP_TAG_STRING)) != NULL)) { - if ((ver = strstr(attr->values[0].string.text, + if ((ver = strstr(ippGetString(attr, 0, NULL), NOVELL_SERVER_VERSION_STRING)) != NULL) { ver += strlen(NOVELL_SERVER_VERSION_STRING); /* @@ -137,7 +180,7 @@ static int iprint_get_server_version(http_t *http, char* serviceUri) serverVersion = 0; } - if ((os = strstr(attr->values[0].string.text, + if ((os = strstr(ippGetString(attr, 0, NULL), NOVELL_SERVER_SYSNAME)) != NULL) { os += strlen(NOVELL_SERVER_SYSNAME); if ((temp = strchr(os,'<')) != NULL) @@ -186,8 +229,8 @@ static int iprint_cache_add_printer(http_t *http, request = ippNew(); - request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES; - request->request.op.request_id = reqId; + ippSetOperation(request, IPP_GET_PRINTER_ATTRIBUTES); + ippSetRequestId(request, reqId); language = cupsLangDefault(); @@ -232,13 +275,13 @@ static int iprint_cache_add_printer(http_t *http, goto out; } - for (attr = response->attrs; attr != NULL;) { + for (attr = ippFirstAttribute(response); attr != NULL;) { /* * Skip leading attributes until we hit a printer... */ - while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER) - attr = attr->next; + while (attr != NULL && ippGetGroupTag(attr) != IPP_TAG_PRINTER) + attr = ippNextAttribute(response); if (attr == NULL) break; @@ -252,15 +295,15 @@ static int iprint_cache_add_printer(http_t *http, smb_enabled= 1; secure = 0; - while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER) { - if (strcmp(attr->name, "printer-name") == 0 && - attr->value_tag == IPP_TAG_NAME) - name = attr->values[0].string.text; + while (attr != NULL && ippGetGroupTag(attr) == IPP_TAG_PRINTER) { + if (strcmp(ippGetName(attr), "printer-name") == 0 && + ippGetValueTag(attr) == IPP_TAG_NAME) + name = ippGetString(attr, 0, NULL); - if (strcmp(attr->name, "printer-info") == 0 && - (attr->value_tag == IPP_TAG_TEXT || - attr->value_tag == IPP_TAG_TEXTLANG)) - info = attr->values[0].string.text; + if (strcmp(ippGetName(attr), "printer-info") == 0 && + (ippGetValueTag(attr) == IPP_TAG_TEXT || + ippGetValueTag(attr) == IPP_TAG_TEXTLANG)) + info = ippGetString(attr, 0, NULL); /* * If the smb-enabled attribute is present and the @@ -268,11 +311,11 @@ static int iprint_cache_add_printer(http_t *http, * If the attribute is not present, assume that the * printer should show up */ - if (!strcmp(attr->name, "smb-enabled") && - ((attr->value_tag == IPP_TAG_INTEGER && - !attr->values[0].integer) || - (attr->value_tag == IPP_TAG_BOOLEAN && - !attr->values[0].boolean))) + if (!strcmp(ippGetName(attr), "smb-enabled") && + ((ippGetValueTag(attr) == IPP_TAG_INTEGER && + !ippGetInteger(attr, 0)) || + (ippGetValueTag(attr) == IPP_TAG_BOOLEAN && + !ippGetBoolean(attr, 0)))) smb_enabled = 0; /* @@ -281,14 +324,14 @@ static int iprint_cache_add_printer(http_t *http, * If the attribute is not present, assume that the * printer should show up */ - if (!strcmp(attr->name, "security-enabled") && - ((attr->value_tag == IPP_TAG_INTEGER && - attr->values[0].integer) || - (attr->value_tag == IPP_TAG_BOOLEAN && - attr->values[0].boolean))) + if (!strcmp(ippGetName(attr), "security-enabled") && + ((ippGetValueTag(attr) == IPP_TAG_INTEGER && + ippGetInteger(attr, 0)) || + (ippGetValueTag(attr) == IPP_TAG_BOOLEAN && + ippGetBoolean(attr, 0)))) secure = 1; - attr = attr->next; + attr = ippNextAttribute(response); } /* @@ -345,9 +388,8 @@ bool iprint_cache_reload(void) request = ippNew(); - request->request.op.operation_id = - (ipp_op_t)OPERATION_NOVELL_LIST_PRINTERS; - request->request.op.request_id = 1; + ippSetOperation(request, (ipp_op_t)OPERATION_NOVELL_LIST_PRINTERS); + ippSetRequestId(request, 1); language = cupsLangDefault(); @@ -370,13 +412,13 @@ bool iprint_cache_reload(void) goto out; } - for (attr = response->attrs; attr != NULL;) { + for (attr = ippFirstAttribute(response); attr != NULL;) { /* * Skip leading attributes until we hit a printer... */ - while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER) - attr = attr->next; + while (attr != NULL && ippGetGroupTag(attr) != IPP_TAG_PRINTER) + attr = ippNextAttribute(response); if (attr == NULL) break; @@ -385,24 +427,24 @@ bool iprint_cache_reload(void) * Pull the needed attributes from this printer... */ - while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER) + while (attr != NULL && ippGetGroupTag(attr) == IPP_TAG_PRINTER) { - if (strcmp(attr->name, "printer-name") == 0 && - (attr->value_tag == IPP_TAG_URI || - attr->value_tag == IPP_TAG_NAME || - attr->value_tag == IPP_TAG_TEXT || - attr->value_tag == IPP_TAG_NAMELANG || - attr->value_tag == IPP_TAG_TEXTLANG)) + if (strcmp(ippGetName(attr), "printer-name") == 0 && + (ippGetValueTag(attr) == IPP_TAG_URI || + ippGetValueTag(attr) == IPP_TAG_NAME || + ippGetValueTag(attr) == IPP_TAG_TEXT || + ippGetValueTag(attr) == IPP_TAG_NAMELANG || + ippGetValueTag(attr) == IPP_TAG_TEXTLANG)) { - for (i = 0; i<attr->num_values; i++) + for (i = 0; i<ippGetCount(attr); i++) { - char *url = attr->values[i].string.text; + char *url = ippGetString(attr, i, NULL); if (!url || !strlen(url)) continue; iprint_cache_add_printer(http, i+2, url); } } - attr = attr->next; + attr = ippNextAttribute(response); } } @@ -468,8 +510,8 @@ static int iprint_job_delete(const char *sharename, const char *lprm_command, st request = ippNew(); - request->request.op.operation_id = IPP_CANCEL_JOB; - request->request.op.request_id = 1; + ippSetOperation(request, IPP_CANCEL_JOB); + ippSetRequestId(request, 1); language = cupsLangDefault(); @@ -495,7 +537,7 @@ static int iprint_job_delete(const char *sharename, const char *lprm_command, st slprintf(httpPath, sizeof(httpPath) - 1, "/ipp/%s", sharename); if ((response = cupsDoRequest(http, request, httpPath)) != NULL) { - if (response->request.status.status_code >= IPP_OK_CONFLICT) { + if (ippGetStatusCode(response) >= IPP_OK_CONFLICT) { DEBUG(0,("Unable to cancel job %d - %s\n", pjob->sysjob, ippErrorString(cupsLastError()))); } else { @@ -566,8 +608,8 @@ static int iprint_job_pause(int snum, struct printjob *pjob) request = ippNew(); - request->request.op.operation_id = IPP_HOLD_JOB; - request->request.op.request_id = 1; + ippSetOperation(request, IPP_HOLD_JOB); + ippSetRequestId(request, 1); language = cupsLangDefault(); @@ -595,7 +637,7 @@ static int iprint_job_pause(int snum, struct printjob *pjob) lp_printername(talloc_tos(), snum)); if ((response = cupsDoRequest(http, request, httpPath)) != NULL) { - if (response->request.status.status_code >= IPP_OK_CONFLICT) { + if (ippGetStatusCode(response) >= IPP_OK_CONFLICT) { DEBUG(0,("Unable to hold job %d - %s\n", pjob->sysjob, ippErrorString(cupsLastError()))); } else { @@ -666,8 +708,8 @@ static int iprint_job_resume(int snum, struct printjob *pjob) request = ippNew(); - request->request.op.operation_id = IPP_RELEASE_JOB; - request->request.op.request_id = 1; + ippSetOperation(request, IPP_RELEASE_JOB); + ippSetRequestId(request, 1); language = cupsLangDefault(); @@ -695,7 +737,7 @@ static int iprint_job_resume(int snum, struct printjob *pjob) lp_printername(talloc_tos(), snum)); if ((response = cupsDoRequest(http, request, httpPath)) != NULL) { - if (response->request.status.status_code >= IPP_OK_CONFLICT) { + if (ippGetStatusCode(response) >= IPP_OK_CONFLICT) { DEBUG(0,("Unable to release job %d - %s\n", pjob->sysjob, ippErrorString(cupsLastError()))); } else { @@ -767,8 +809,8 @@ static int iprint_job_submit(int snum, struct printjob *pjob, request = ippNew(); - request->request.op.operation_id = IPP_PRINT_JOB; - request->request.op.request_id = 1; + ippSetOperation(request, IPP_PRINT_JOB); + ippSetRequestId(request, 1); language = cupsLangDefault(); @@ -801,7 +843,7 @@ static int iprint_job_submit(int snum, struct printjob *pjob, slprintf(uri, sizeof(uri) - 1, "/ipp/%s", lp_printername(talloc_tos(), snum)); if ((response = cupsDoFileRequest(http, request, uri, pjob->filename)) != NULL) { - if (response->request.status.status_code >= IPP_OK_CONFLICT) { + if (ippGetStatusCode(response) >= IPP_OK_CONFLICT) { DEBUG(0,("Unable to print file to %s - %s\n", lp_printername(talloc_tos(), snum), ippErrorString(cupsLastError()))); @@ -821,9 +863,9 @@ static int iprint_job_submit(int snum, struct printjob *pjob, if ( ret == 0 ) { attr = ippFindAttribute(response, "job-id", IPP_TAG_INTEGER); - if (attr != NULL && attr->group_tag == IPP_TAG_JOB) + if (attr != NULL && ippGetGroupTag(attr) == IPP_TAG_JOB) { - pjob->sysjob = attr->values[0].integer; + pjob->sysjob = ippGetInteger(attr, 0); } } @@ -942,8 +984,8 @@ static int iprint_queue_get(const char *sharename, request = ippNew(); - request->request.op.operation_id = IPP_GET_PRINTER_ATTRIBUTES; - request->request.op.request_id = 2; + ippSetOperation(request, IPP_GET_PRINTER_ATTRIBUTES); + ippSetRequestId(request, 2); language = cupsLangDefault(); @@ -974,9 +1016,9 @@ static int iprint_queue_get(const char *sharename, goto out; } - if (response->request.status.status_code >= IPP_OK_CONFLICT) { + if (ippGetStatusCode(response) >= IPP_OK_CONFLICT) { DEBUG(0,("Unable to get printer status for %s - %s\n", printername, - ippErrorString(response->request.status.status_code))); + ippErrorString(ippGetStatusCode(response)))); *q = queue; goto out; } @@ -986,7 +1028,7 @@ static int iprint_queue_get(const char *sharename, */ if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL) { - if (attr->values[0].integer == IPP_PRINTER_STOPPED) + if (ippGetInteger(attr, 0) == IPP_PRINTER_STOPPED) status->status = LPSTAT_STOPPED; else status->status = LPSTAT_OK; @@ -994,11 +1036,11 @@ static int iprint_queue_get(const char *sharename, if ((attr = ippFindAttribute(response, "printer-state-message", IPP_TAG_TEXT)) != NULL) - fstrcpy(status->message, attr->values[0].string.text); + fstrcpy(status->message, ippGetString(attr, 0, NULL)); if ((attr = ippFindAttribute(response, "printer-up-time", IPP_TAG_INTEGER)) != NULL) - printer_up_time = attr->values[0].integer; + printer_up_time = ippGetInteger(attr, 0); ippDelete(response); response = NULL; @@ -1015,8 +1057,8 @@ static int iprint_queue_get(const char *sharename, request = ippNew(); - request->request.op.operation_id = IPP_GET_JOBS; - request->request.op.request_id = 3; + ippSetOperation(request, IPP_GET_JOBS); + ippSetRequestId(request, 3); ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, "attributes-charset", NULL, "utf-8"); @@ -1044,9 +1086,9 @@ static int iprint_queue_get(const char *sharename, goto out; } - if (response->request.status.status_code >= IPP_OK_CONFLICT) { + if (ippGetStatusCode(response) >= IPP_OK_CONFLICT) { DEBUG(0,("Unable to get jobs for %s - %s\n", uri, - ippErrorString(response->request.status.status_code))); + ippErrorString(ippGetStatusCode(response)))); goto out; } @@ -1058,13 +1100,13 @@ static int iprint_queue_get(const char *sharename, qalloc = 0; queue = NULL; - for (attr = response->attrs; attr != NULL; attr = attr->next) { + for (attr = ippFirstAttribute(response); attr != NULL; attr = ippNextAttribute(response)) { /* * Skip leading attributes until we hit a job... */ - while (attr != NULL && attr->group_tag != IPP_TAG_JOB) - attr = attr->next; + while (attr != NULL && ippGetGroupTag(attr) != IPP_TAG_JOB) + attr = ippNextAttribute(response); if (attr == NULL) break; @@ -1099,30 +1141,30 @@ static int iprint_queue_get(const char *sharename, user_name = NULL; job_name = NULL; - while (attr != NULL && attr->group_tag == IPP_TAG_JOB) { - if (attr->name == NULL) { - attr = attr->next; + while (attr != NULL && ippGetGroupTag(attr) == IPP_TAG_JOB) { + if (ippGetName(attr) == NULL) { + attr = ippNextAttribute(response); break; } - if (strcmp(attr->name, "job-id") == 0 && - attr->value_tag == IPP_TAG_INTEGER) - job_id = attr->values[0].integer; + if (strcmp(ippGetName(attr), "job-id") == 0 && + ippGetValueTag(attr) == IPP_TAG_INTEGER) + job_id = ippGetInteger(attr, 0); - if (strcmp(attr->name, "job-k-octets") == 0 && - attr->value_tag == IPP_TAG_INTEGER) - job_k_octets = attr->values[0].integer; + if (strcmp(ippGetName(attr), "job-k-octets") == 0 && + ippGetValueTag(attr) == IPP_TAG_INTEGER) + job_k_octets = ippGetInteger(attr, 0); - if (strcmp(attr->name, "job-priority") == 0 && - attr->value_tag == IPP_TAG_INTEGER) - job_priority = attr->values[0].integer; + if (strcmp(ippGetName(attr), "job-priority") == 0 && + ippGetValueTag(attr) == IPP_TAG_INTEGER) + job_priority = ippGetInteger(attr, 0); - if (strcmp(attr->name, "job-state") == 0 && - attr->value_tag == IPP_TAG_ENUM) - job_status = (ipp_jstate_t)(attr->values[0].integer); + if (strcmp(ippGetName(attr), "job-state") == 0 && + ippGetValueTag(attr) == IPP_TAG_ENUM) + job_status = (ipp_jstate_t)ippGetInteger(attr, 0); - if (strcmp(attr->name, "time-at-creation") == 0 && - attr->value_tag == IPP_TAG_INTEGER) + if (strcmp(ippGetName(attr), "time-at-creation") == 0 && + ippGetValueTag(attr) == IPP_TAG_INTEGER) { /* * If jobs times are in Unix time, the accuracy of the job @@ -1132,22 +1174,22 @@ static int iprint_queue_get(const char *sharename, */ if (jobUseUnixTime) - job_time = attr->values[0].integer; + job_time = ippGetInteger(attr, 0); else - job_time = time(NULL) - printer_up_time + attr->values[0].integer; + job_time = time(NULL) - printer_up_time + ippGetInteger(attr, 0); } - if (strcmp(attr->name, "job-name") == 0 && - (attr->value_tag == IPP_TAG_NAMELANG || - attr->value_tag == IPP_TAG_NAME)) - job_name = attr->values[0].string.text; + if (strcmp(ippGetName(attr), "job-name") == 0 && + (ippGetValueTag(attr) == IPP_TAG_NAMELANG || + ippGetValueTag(attr) == IPP_TAG_NAME)) + job_name = ippGetString(attr, 0, NULL); - if (strcmp(attr->name, "job-originating-user-name") == 0 && - (attr->value_tag == IPP_TAG_NAMELANG || - attr->value_tag == IPP_TAG_NAME)) - user_name = attr->values[0].string.text; + if (strcmp(ippGetName(attr), "job-originating-user-name") == 0 && + (ippGetValueTag(attr) == IPP_TAG_NAMELANG || + ippGetValueTag(attr) == IPP_TAG_NAME)) + user_name = ippGetString(attr, 0, NULL); - attr = attr->next; + attr = ippNextAttribute(response); } /* |