The Samba-Bugzilla – Attachment 3651 Details for
Bug 5080
Access to cups-printers via samba broken with cups 1.3.4, Unsupported character set
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch for 3.3.x.
look1 (text/plain), 27.12 KB, created by
Jeremy Allison
on 2008-10-01 18:27:58 UTC
(
hide
)
Description:
Patch for 3.3.x.
Filename:
MIME Type:
Creator:
Jeremy Allison
Created:
2008-10-01 18:27:58 UTC
Size:
27.12 KB
patch
obsolete
>diff --git a/source/printing/print_cups.c b/source/printing/print_cups.c >index 97584cb..b46d83b 100644 >--- a/source/printing/print_cups.c >+++ b/source/printing/print_cups.c >@@ -2,6 +2,7 @@ > * Support code for the Common UNIX Printing System ("CUPS") > * > * Copyright 1999-2003 by Michael R Sweet. >+ * Copyright 2008 Jeremy Allison. > * > * This program is free software; you can redistribute it and/or modify > * it under the terms of the GNU General Public License as published by >@@ -17,6 +18,10 @@ > * along with this program; if not, see <http://www.gnu.org/licenses/>. > */ > >+/* >+ * JRA. Converted to utf8 pull/push. >+ */ >+ > #include "includes.h" > #include "printing.h" > >@@ -51,24 +56,23 @@ cups_passwd_cb(const char *prompt) /* I - Prompt */ > return (NULL); > } > >-static http_t *cups_connect(void) >+static http_t *cups_connect(TALLOC_CTX *frame) > { >- http_t *http; >- char *server, *p; >+ http_t *http = NULL; >+ char *server = NULL, *p = NULL; > int port; > int timeout = lp_cups_connection_timeout(); >- >- gotalarm = 0; >- >- if (timeout) { >- CatchSignal(SIGALRM, SIGNAL_CAST gotalarm_sig); >- alarm(timeout); >- } >+ size_t size; > > if (lp_cups_server() != NULL && strlen(lp_cups_server()) > 0) { >- server = smb_xstrdup(lp_cups_server()); >+ if (!push_utf8_talloc(frame, &server, lp_cups_server(), &size)) { >+ return NULL; >+ } > } else { >- server = smb_xstrdup(cupsServer()); >+ server = talloc_strdup(frame,cupsServer()); >+ } >+ if (server) { >+ return NULL; > } > > p = strchr(server, ':'); >@@ -82,6 +86,13 @@ static http_t *cups_connect(void) > DEBUG(10, ("connecting to cups server %s:%d\n", > server, port)); > >+ gotalarm = 0; >+ >+ if (timeout) { >+ CatchSignal(SIGALRM, SIGNAL_CAST gotalarm_sig); >+ alarm(timeout); >+ } >+ > http = httpConnect(server, port); > > CatchSignal(SIGALRM, SIGNAL_CAST SIG_IGN); >@@ -92,12 +103,12 @@ static http_t *cups_connect(void) > server, port, strerror(errno))); > } > >- SAFE_FREE(server); > return http; > } > > bool cups_cache_reload(void) > { >+ TALLOC_CTX *frame = talloc_stackframe(); > http_t *http = NULL; /* HTTP connection to server */ > ipp_t *request = NULL, /* IPP Request */ > *response = NULL; /* IPP Response */ >@@ -111,6 +122,7 @@ bool cups_cache_reload(void) > "printer-info" > }; > bool ret = False; >+ size_t size; > > DEBUG(5, ("reloading cups printcap cache\n")); > >@@ -124,7 +136,7 @@ bool cups_cache_reload(void) > * Try to connect to the server... > */ > >- if ((http = cups_connect()) == NULL) { >+ if ((http = cups_connect(frame)) == NULL) { > goto out; > } > >@@ -145,7 +157,7 @@ bool cups_cache_reload(void) > language = cupsLangDefault(); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, >- "attributes-charset", NULL, cupsLangEncoding(language)); >+ "attributes-charset", NULL, "utf-8"); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, > "attributes-natural-language", NULL, language->language); >@@ -185,12 +197,24 @@ bool cups_cache_reload(void) > > 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; >+ attr->value_tag == IPP_TAG_NAME) { >+ if (!pull_utf8_talloc(frame, >+ &name, >+ attr->values[0].string.text, >+ &size)) { >+ goto out; >+ } >+ } > > if (strcmp(attr->name, "printer-info") == 0 && >- attr->value_tag == IPP_TAG_TEXT) >- info = attr->values[0].string.text; >+ attr->value_tag == IPP_TAG_TEXT) { >+ if (!pull_utf8_talloc(frame, >+ &info, >+ attr->values[0].string.text, >+ &size)) { >+ goto out; >+ } >+ } > > attr = attr->next; > } >@@ -225,7 +249,7 @@ bool cups_cache_reload(void) > request->request.op.request_id = 1; > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, >- "attributes-charset", NULL, cupsLangEncoding(language)); >+ "attributes-charset", NULL, "utf-8"); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, > "attributes-natural-language", NULL, language->language); >@@ -265,12 +289,24 @@ bool cups_cache_reload(void) > > 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; >+ attr->value_tag == IPP_TAG_NAME) { >+ if (!pull_utf8_talloc(frame, >+ &name, >+ attr->values[0].string.text, >+ &size)) { >+ goto out; >+ } >+ } > > if (strcmp(attr->name, "printer-info") == 0 && >- attr->value_tag == IPP_TAG_TEXT) >- info = attr->values[0].string.text; >+ attr->value_tag == IPP_TAG_TEXT) { >+ if (!pull_utf8_talloc(frame, >+ &info, >+ attr->values[0].string.text, >+ &size)) { >+ goto out; >+ } >+ } > > attr = attr->next; > } >@@ -299,6 +335,7 @@ bool cups_cache_reload(void) > if (http) > httpClose(http); > >+ TALLOC_FREE(frame); > return ret; > } > >@@ -309,13 +346,15 @@ bool cups_cache_reload(void) > > static int cups_job_delete(const char *sharename, const char *lprm_command, struct printjob *pjob) > { >+ TALLOC_CTX *frame = talloc_stackframe(); > int ret = 1; /* Return value */ > http_t *http = NULL; /* HTTP connection to server */ > ipp_t *request = NULL, /* IPP Request */ > *response = NULL; /* IPP Response */ > cups_lang_t *language = NULL; /* Default language */ >+ char *user = NULL; > char uri[HTTP_MAX_URI]; /* printer-uri attribute */ >- >+ size_t size; > > DEBUG(5,("cups_job_delete(%s, %p (%d))\n", sharename, pjob, pjob->sysjob)); > >@@ -329,7 +368,7 @@ static int cups_job_delete(const char *sharename, const char *lprm_command, stru > * Try to connect to the server... > */ > >- if ((http = cups_connect()) == NULL) { >+ if ((http = cups_connect(frame)) == NULL) { > goto out; > } > >@@ -351,7 +390,7 @@ static int cups_job_delete(const char *sharename, const char *lprm_command, stru > language = cupsLangDefault(); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, >- "attributes-charset", NULL, cupsLangEncoding(language)); >+ "attributes-charset", NULL, "utf-8"); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, > "attributes-natural-language", NULL, language->language); >@@ -360,8 +399,12 @@ static int cups_job_delete(const char *sharename, const char *lprm_command, stru > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); > >+ if (!push_utf8_talloc(frame, &user, pjob->user, &size)) { >+ goto out; >+ } >+ > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", >- NULL, pjob->user); >+ NULL, user); > > /* > * Do the request and get back a response... >@@ -389,6 +432,7 @@ static int cups_job_delete(const char *sharename, const char *lprm_command, stru > if (http) > httpClose(http); > >+ TALLOC_FREE(frame); > return ret; > } > >@@ -399,13 +443,15 @@ static int cups_job_delete(const char *sharename, const char *lprm_command, stru > > static int cups_job_pause(int snum, struct printjob *pjob) > { >+ TALLOC_CTX *frame = talloc_stackframe(); > int ret = 1; /* Return value */ > http_t *http = NULL; /* HTTP connection to server */ > ipp_t *request = NULL, /* IPP Request */ > *response = NULL; /* IPP Response */ > cups_lang_t *language = NULL; /* Default language */ >+ char *user = NULL; > char uri[HTTP_MAX_URI]; /* printer-uri attribute */ >- >+ size_t size; > > DEBUG(5,("cups_job_pause(%d, %p (%d))\n", snum, pjob, pjob->sysjob)); > >@@ -419,7 +465,7 @@ static int cups_job_pause(int snum, struct printjob *pjob) > * Try to connect to the server... > */ > >- if ((http = cups_connect()) == NULL) { >+ if ((http = cups_connect(frame)) == NULL) { > goto out; > } > >@@ -441,7 +487,7 @@ static int cups_job_pause(int snum, struct printjob *pjob) > language = cupsLangDefault(); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, >- "attributes-charset", NULL, cupsLangEncoding(language)); >+ "attributes-charset", NULL, "utf-8"); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, > "attributes-natural-language", NULL, language->language); >@@ -450,8 +496,11 @@ static int cups_job_pause(int snum, struct printjob *pjob) > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); > >+ if (!push_utf8_talloc(frame, &user, pjob->user, &size)) { >+ goto out; >+ } > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", >- NULL, pjob->user); >+ NULL, user); > > /* > * Do the request and get back a response... >@@ -479,6 +528,7 @@ static int cups_job_pause(int snum, struct printjob *pjob) > if (http) > httpClose(http); > >+ TALLOC_FREE(frame); > return ret; > } > >@@ -489,13 +539,15 @@ static int cups_job_pause(int snum, struct printjob *pjob) > > static int cups_job_resume(int snum, struct printjob *pjob) > { >+ TALLOC_CTX *frame = talloc_stackframe(); > int ret = 1; /* Return value */ > http_t *http = NULL; /* HTTP connection to server */ > ipp_t *request = NULL, /* IPP Request */ > *response = NULL; /* IPP Response */ > cups_lang_t *language = NULL; /* Default language */ >+ char *user = NULL; > char uri[HTTP_MAX_URI]; /* printer-uri attribute */ >- >+ size_t size; > > DEBUG(5,("cups_job_resume(%d, %p (%d))\n", snum, pjob, pjob->sysjob)); > >@@ -509,7 +561,7 @@ static int cups_job_resume(int snum, struct printjob *pjob) > * Try to connect to the server... > */ > >- if ((http = cups_connect()) == NULL) { >+ if ((http = cups_connect(frame)) == NULL) { > goto out; > } > >@@ -531,7 +583,7 @@ static int cups_job_resume(int snum, struct printjob *pjob) > language = cupsLangDefault(); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, >- "attributes-charset", NULL, cupsLangEncoding(language)); >+ "attributes-charset", NULL, "utf-8"); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, > "attributes-natural-language", NULL, language->language); >@@ -540,8 +592,11 @@ static int cups_job_resume(int snum, struct printjob *pjob) > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); > >+ if (!push_utf8_talloc(frame, &user, pjob->user, &size)) { >+ goto out; >+ } > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", >- NULL, pjob->user); >+ NULL, user); > > /* > * Do the request and get back a response... >@@ -569,6 +624,7 @@ static int cups_job_resume(int snum, struct printjob *pjob) > if (http) > httpClose(http); > >+ TALLOC_FREE(frame); > return ret; > } > >@@ -579,6 +635,7 @@ static int cups_job_resume(int snum, struct printjob *pjob) > > static int cups_job_submit(int snum, struct printjob *pjob) > { >+ TALLOC_CTX *frame = talloc_stackframe(); > int ret = 1; /* Return value */ > http_t *http = NULL; /* HTTP connection to server */ > ipp_t *request = NULL, /* IPP Request */ >@@ -589,6 +646,12 @@ static int cups_job_submit(int snum, struct printjob *pjob) > char *new_jobname = NULL; > int num_options = 0; > cups_option_t *options = NULL; >+ char *printername = NULL; >+ char *user = NULL; >+ char *jobname = NULL; >+ char *cupsoptions = NULL; >+ char *filename = NULL; >+ size_t size; > char addr[INET6_ADDRSTRLEN]; > > DEBUG(5,("cups_job_submit(%d, %p (%d))\n", snum, pjob, pjob->sysjob)); >@@ -603,7 +666,7 @@ static int cups_job_submit(int snum, struct printjob *pjob) > * Try to connect to the server... > */ > >- if ((http = cups_connect()) == NULL) { >+ if ((http = cups_connect(frame)) == NULL) { > goto out; > } > >@@ -626,19 +689,25 @@ static int cups_job_submit(int snum, struct printjob *pjob) > language = cupsLangDefault(); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, >- "attributes-charset", NULL, cupsLangEncoding(language)); >+ "attributes-charset", NULL, "utf-8"); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, > "attributes-natural-language", NULL, language->language); > >+ if (!push_utf8_talloc(frame, &printername, PRINTERNAME(snum), &size)) { >+ goto out; >+ } > slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s", >- PRINTERNAME(snum)); >+ printername); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, > "printer-uri", NULL, uri); > >+ if (!push_utf8_talloc(frame, &user, pjob->user, &size)) { >+ goto out; >+ } > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", >- NULL, pjob->user); >+ NULL, user); > > clientname = client_name(get_client_fd()); > if (strcmp(clientname, "UNKNOWN") == 0) { >@@ -649,8 +718,14 @@ static int cups_job_submit(int snum, struct printjob *pjob) > "job-originating-host-name", NULL, > clientname); > >- if (asprintf(&new_jobname,"%s%.8u %s", PRINT_SPOOL_PREFIX, >- (unsigned int)pjob->smbjob, pjob->jobname) < 0) { >+ if (!push_utf8_talloc(frame, &jobname, pjob->jobname, &size)) { >+ goto out; >+ } >+ new_jobname = talloc_asprintf(frame, >+ "%s%.8u %s", PRINT_SPOOL_PREFIX, >+ (unsigned int)pjob->smbjob, >+ jobname); >+ if (new_jobname == NULL) { > goto out; > } > >@@ -661,9 +736,12 @@ static int cups_job_submit(int snum, struct printjob *pjob) > * add any options defined in smb.conf > */ > >+ if (!push_utf8_talloc(frame, &cupsoptions, lp_cups_options(snum), &size)) { >+ goto out; >+ } > num_options = 0; > options = NULL; >- num_options = cupsParseOptions(lp_cups_options(snum), num_options, &options); >+ num_options = cupsParseOptions(cupsoptions, num_options, &options); > > if ( num_options ) > cupsEncodeOptions(request, num_options, options); >@@ -672,8 +750,11 @@ static int cups_job_submit(int snum, struct printjob *pjob) > * Do the request and get back a response... > */ > >- slprintf(uri, sizeof(uri) - 1, "/printers/%s", PRINTERNAME(snum)); >+ slprintf(uri, sizeof(uri) - 1, "/printers/%s", printername); > >+ if (!push_utf8_talloc(frame, &filename, pjob->filename, &size)) { >+ goto out; >+ } > if ((response = cupsDoFileRequest(http, request, uri, pjob->filename)) != NULL) { > if (response->request.status.status_code >= IPP_OK_CONFLICT) { > DEBUG(0,("Unable to print file to %s - %s\n", PRINTERNAME(snum), >@@ -700,7 +781,7 @@ static int cups_job_submit(int snum, struct printjob *pjob) > if (http) > httpClose(http); > >- SAFE_FREE(new_jobname); >+ TALLOC_FREE(frame); > > return ret; > } >@@ -715,7 +796,8 @@ static int cups_queue_get(const char *sharename, > print_queue_struct **q, > print_status_struct *status) > { >- fstring printername; >+ TALLOC_CTX *frame = talloc_stackframe(); >+ char *printername = NULL; > http_t *http = NULL; /* HTTP connection to server */ > ipp_t *request = NULL, /* IPP Request */ > *response = NULL; /* IPP Response */ >@@ -726,13 +808,14 @@ static int cups_queue_get(const char *sharename, > qalloc = 0; /* Number of queue entries allocated */ > print_queue_struct *queue = NULL, /* Queue entries */ > *temp; /* Temporary pointer for queue */ >- const char *user_name, /* job-originating-user-name attribute */ >- *job_name; /* job-name attribute */ >+ char *user_name = NULL, /* job-originating-user-name attribute */ >+ *job_name = NULL; /* job-name attribute */ > int job_id; /* job-id attribute */ > int job_k_octets; /* job-k-octets attribute */ > time_t job_time; /* time-at-creation attribute */ > ipp_jstate_t job_status; /* job-status attribute */ > int job_priority; /* job-priority attribute */ >+ size_t size; > static const char *jattrs[] = /* Requested job attributes */ > { > "job-id", >@@ -757,9 +840,10 @@ static int cups_queue_get(const char *sharename, > (which is basically what we do for non-cups printers ... using > the lpq_command to get the queue listing). */ > >- fstrcpy( printername, lpq_command ); >- >- DEBUG(5,("cups_queue_get(%s, %p, %p)\n", printername, q, status)); >+ if (!push_utf8_talloc(frame, &printername, lpq_command, &size)) { >+ goto out; >+ } >+ DEBUG(5,("cups_queue_get(%s, %p, %p)\n", lpq_command, q, status)); > > /* > * Make sure we don't ask for passwords... >@@ -771,7 +855,7 @@ static int cups_queue_get(const char *sharename, > * Try to connect to the server... > */ > >- if ((http = cups_connect()) == NULL) { >+ if ((http = cups_connect(frame)) == NULL) { > goto out; > } > >@@ -799,7 +883,7 @@ static int cups_queue_get(const char *sharename, > language = cupsLangDefault(); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, >- "attributes-charset", NULL, cupsLangEncoding(language)); >+ "attributes-charset", NULL, "utf-8"); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, > "attributes-natural-language", NULL, language->language); >@@ -904,12 +988,24 @@ static int cups_queue_get(const char *sharename, > job_time = attr->values[0].integer; > > if (strcmp(attr->name, "job-name") == 0 && >- attr->value_tag == IPP_TAG_NAME) >- job_name = attr->values[0].string.text; >+ attr->value_tag == IPP_TAG_NAME) { >+ if (!pull_utf8_talloc(frame, >+ &job_name, >+ attr->values[0].string.text, >+ &size)) { >+ goto out; >+ } >+ } > > if (strcmp(attr->name, "job-originating-user-name") == 0 && >- attr->value_tag == IPP_TAG_NAME) >- user_name = attr->values[0].string.text; >+ attr->value_tag == IPP_TAG_NAME) { >+ if (!pull_utf8_talloc(frame, >+ &user_name, >+ attr->values[0].string.text, >+ &size)) { >+ goto out; >+ } >+ } > > attr = attr->next; > } >@@ -933,8 +1029,8 @@ static int cups_queue_get(const char *sharename, > LPQ_PRINTING; > temp->priority = job_priority; > temp->time = job_time; >- strncpy(temp->fs_user, user_name, sizeof(temp->fs_user) - 1); >- strncpy(temp->fs_file, job_name, sizeof(temp->fs_file) - 1); >+ strlcpy(temp->fs_user, user_name, sizeof(temp->fs_user)); >+ strlcpy(temp->fs_file, job_name, sizeof(temp->fs_file)); > > qcount ++; > >@@ -961,7 +1057,7 @@ static int cups_queue_get(const char *sharename, > request->request.op.request_id = 1; > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, >- "attributes-charset", NULL, cupsLangEncoding(language)); >+ "attributes-charset", NULL, "utf-8"); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, > "attributes-natural-language", NULL, language->language); >@@ -1004,8 +1100,15 @@ static int cups_queue_get(const char *sharename, > } > > if ((attr = ippFindAttribute(response, "printer-state-message", >- IPP_TAG_TEXT)) != NULL) >- fstrcpy(status->message, attr->values[0].string.text); >+ IPP_TAG_TEXT)) != NULL) { >+ char *msg = NULL; >+ if (!pull_utf8_talloc(frame, &msg, >+ attr->values[0].string.text, >+ &size)) { >+ goto out; >+ } >+ fstrcpy(status->message, msg); >+ } > > /* > * Return the job queue... >@@ -1023,6 +1126,7 @@ static int cups_queue_get(const char *sharename, > if (http) > httpClose(http); > >+ TALLOC_FREE(frame); > return qcount; > } > >@@ -1033,13 +1137,16 @@ static int cups_queue_get(const char *sharename, > > static int cups_queue_pause(int snum) > { >+ TALLOC_CTX *frame = talloc_stackframe(); > int ret = 1; /* Return value */ > http_t *http = NULL; /* HTTP connection to server */ > ipp_t *request = NULL, /* IPP Request */ > *response = NULL; /* IPP Response */ > cups_lang_t *language = NULL; /* Default language */ >+ char *printername = NULL; >+ char *username = NULL; > char uri[HTTP_MAX_URI]; /* printer-uri attribute */ >- >+ size_t size; > > DEBUG(5,("cups_queue_pause(%d)\n", snum)); > >@@ -1053,7 +1160,7 @@ static int cups_queue_pause(int snum) > * Try to connect to the server... > */ > >- if ((http = cups_connect()) == NULL) { >+ if ((http = cups_connect(frame)) == NULL) { > goto out; > } > >@@ -1075,18 +1182,24 @@ static int cups_queue_pause(int snum) > language = cupsLangDefault(); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, >- "attributes-charset", NULL, cupsLangEncoding(language)); >+ "attributes-charset", NULL, "utf-8"); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, > "attributes-natural-language", NULL, language->language); > >+ if (!push_utf8_talloc(frame, &printername, PRINTERNAME(snum), &size)) { >+ goto out; >+ } > slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s", >- PRINTERNAME(snum)); >+ printername); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); > >+ if (!push_utf8_talloc(frame, &username, current_user_info.unix_name, &size)) { >+ goto out; >+ } > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", >- NULL, current_user_info.unix_name); >+ NULL, username); > > /* > * Do the request and get back a response... >@@ -1114,6 +1227,7 @@ static int cups_queue_pause(int snum) > if (http) > httpClose(http); > >+ TALLOC_FREE(frame); > return ret; > } > >@@ -1124,13 +1238,16 @@ static int cups_queue_pause(int snum) > > static int cups_queue_resume(int snum) > { >+ TALLOC_CTX *frame = talloc_stackframe(); > int ret = 1; /* Return value */ > http_t *http = NULL; /* HTTP connection to server */ > ipp_t *request = NULL, /* IPP Request */ > *response = NULL; /* IPP Response */ > cups_lang_t *language = NULL; /* Default language */ >+ char *printername = NULL; >+ char *username = NULL; > char uri[HTTP_MAX_URI]; /* printer-uri attribute */ >- >+ size_t size; > > DEBUG(5,("cups_queue_resume(%d)\n", snum)); > >@@ -1144,7 +1261,7 @@ static int cups_queue_resume(int snum) > * Try to connect to the server... > */ > >- if ((http = cups_connect()) == NULL) { >+ if ((http = cups_connect(frame)) == NULL) { > goto out; > } > >@@ -1166,18 +1283,24 @@ static int cups_queue_resume(int snum) > language = cupsLangDefault(); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, >- "attributes-charset", NULL, cupsLangEncoding(language)); >+ "attributes-charset", NULL, "utf-8"); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, > "attributes-natural-language", NULL, language->language); > >+ if (!push_utf8_talloc(frame, &printername, PRINTERNAME(snum), &size)) { >+ goto out; >+ } > slprintf(uri, sizeof(uri) - 1, "ipp://localhost/printers/%s", >- PRINTERNAME(snum)); >+ printername); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri); > >+ if (!push_utf8_talloc(frame, &username, current_user_info.unix_name, &size)) { >+ goto out; >+ } > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", >- NULL, current_user_info.unix_name); >+ NULL, username); > > /* > * Do the request and get back a response... >@@ -1205,6 +1328,7 @@ static int cups_queue_resume(int snum) > if (http) > httpClose(http); > >+ TALLOC_FREE(frame); > return ret; > } > >@@ -1226,15 +1350,16 @@ struct printif cups_printif = > > bool cups_pull_comment_location(NT_PRINTER_INFO_LEVEL_2 *printer) > { >+ TALLOC_CTX *frame = talloc_stackframe(); > http_t *http = NULL; /* HTTP connection to server */ > ipp_t *request = NULL, /* IPP Request */ > *response = NULL; /* IPP Response */ > ipp_attribute_t *attr; /* Current attribute */ > cups_lang_t *language = NULL; /* Default language */ >- char *name, /* printer-name attribute */ >- *info, /* printer-info attribute */ >- *location; /* printer-location attribute */ > char uri[HTTP_MAX_URI]; >+ char *server = NULL; >+ char *sharename = NULL; >+ char *name = NULL; > static const char *requested[] =/* Requested attributes */ > { > "printer-name", >@@ -1242,6 +1367,7 @@ bool cups_pull_comment_location(NT_PRINTER_INFO_LEVEL_2 *printer) > "printer-location" > }; > bool ret = False; >+ size_t size; > > DEBUG(5, ("pulling %s location\n", printer->sharename)); > >@@ -1255,7 +1381,7 @@ bool cups_pull_comment_location(NT_PRINTER_INFO_LEVEL_2 *printer) > * Try to connect to the server... > */ > >- if ((http = cups_connect()) == NULL) { >+ if ((http = cups_connect(frame)) == NULL) { > goto out; > } > >@@ -1267,13 +1393,26 @@ bool cups_pull_comment_location(NT_PRINTER_INFO_LEVEL_2 *printer) > language = cupsLangDefault(); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, >- "attributes-charset", NULL, cupsLangEncoding(language)); >+ "attributes-charset", NULL, "utf-8"); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, > "attributes-natural-language", NULL, language->language); > >+ if (lp_cups_server() != NULL && strlen(lp_cups_server()) > 0) { >+ if (!push_utf8_talloc(frame, &server, lp_cups_server(), &size)) { >+ goto out; >+ } >+ } else { >+ server = talloc_strdup(frame,cupsServer()); >+ } >+ if (server) { >+ goto out; >+ } >+ if (!push_utf8_talloc(frame, &sharename, printer->sharename, &size)) { >+ goto out; >+ } > slprintf(uri, sizeof(uri) - 1, "ipp://%s/printers/%s", >- lp_cups_server(), printer->sharename); >+ server, sharename); > > ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, > "printer-uri", NULL, uri); >@@ -1308,21 +1447,34 @@ bool cups_pull_comment_location(NT_PRINTER_INFO_LEVEL_2 *printer) > * Pull the needed attributes from this printer... > */ > >- name = NULL; >- info = NULL; >- location = NULL; >- > while ( attr && (attr->group_tag == IPP_TAG_PRINTER) ) { >+ if (strcmp(attr->name, "printer-name") == 0 && >+ attr->value_tag == IPP_TAG_NAME) { >+ if (!pull_utf8_talloc(frame, >+ &name, >+ attr->values[0].string.text, >+ &size)) { >+ goto out; >+ } >+ } >+ > /* Grab the comment if we don't have one */ > if ( (strcmp(attr->name, "printer-info") == 0) > && (attr->value_tag == IPP_TAG_TEXT) > && !strlen(printer->comment) ) > { >+ char *comment = NULL; >+ if (!pull_utf8_talloc(frame, >+ &comment, >+ attr->values[0].string.text, >+ &size)) { >+ goto out; >+ } > DEBUG(5,("cups_pull_comment_location: Using cups comment: %s\n", >- attr->values[0].string.text)); >+ comment)); > strlcpy(printer->comment, >- attr->values[0].string.text, >- sizeof(printer->comment)); >+ comment, >+ sizeof(printer->comment)); > } > > /* Grab the location if we don't have one */ >@@ -1330,21 +1482,29 @@ bool cups_pull_comment_location(NT_PRINTER_INFO_LEVEL_2 *printer) > && (attr->value_tag == IPP_TAG_TEXT) > && !strlen(printer->location) ) > { >+ char *location = NULL; >+ if (!pull_utf8_talloc(frame, >+ &location, >+ attr->values[0].string.text, >+ &size)) { >+ goto out; >+ } > DEBUG(5,("cups_pull_comment_location: Using cups location: %s\n", >- attr->values[0].string.text)); >- fstrcpy(printer->location,attr->values[0].string.text); >+ location)); >+ strlcpy(printer->location, >+ location, >+ sizeof(printer->location)); > } > > attr = attr->next; > } > > /* >- * See if we have everything needed... >+ * We have everything needed... > */ > >- if (name == NULL) >+ if (name != NULL) > break; >- > } > > ret = True; >@@ -1359,6 +1519,7 @@ bool cups_pull_comment_location(NT_PRINTER_INFO_LEVEL_2 *printer) > if (http) > httpClose(http); > >+ TALLOC_FREE(frame); > return ret; > } >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 5080
:
3015
|
3016
|
3017
|
3018
|
3019
|
3020
|
3650
| 3651 |
3654