*
* 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
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
#include "includes.h"
#include "printing.h"
+#include "printing/pcap.h"
+#include "lib/util/string_wrappers.h"
#ifdef HAVE_IPRINT
#include <cups/cups.h>
#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...
*/
static const char *iprint_server(void)
{
- if ((lp_iprint_server() != NULL) && (strlen(lp_iprint_server()) > 0)) {
+ const struct loadparm_substitution *lp_sub =
+ loadparm_s3_global_substitution();
+ const char *server = lp_iprint_server(talloc_tos(), lp_sub);
+
+ if ((server != NULL) && (strlen(server) > 0)) {
DEBUG(10, ("iprint server explicitly set to %s\n",
- lp_iprint_server()));
- return lp_iprint_server();
+ server));
+ return server;
}
DEBUG(10, ("iprint server left to default %s\n", cupsServer()));
request = ippNew();
- request->request.op.operation_id = OPERATION_NOVELL_MGMT;
- request->request.op.request_id = 1;
+ ippSetOperation(request, (ipp_op_t)OPERATION_NOVELL_MGMT);
+ ippSetRequestId(request, 1);
language = cupsLangDefault();
*/
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);
/*
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)
static int iprint_cache_add_printer(http_t *http,
int reqId,
- char* url)
+ const char *url,
+ struct pcap_cache **pcache)
{
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 */
- smb_enabled, /* smb-enabled attribute */
+ const char *name, /* printer-name attribute */
+ *info; /* printer-info attribute */
+ char smb_enabled, /* smb-enabled attribute */
secure; /* security-enabled attrib. */
- char *httpPath; /* path portion of the printer-uri */
+ const char *httpPath; /* path portion of the printer-uri */
static const char *pattrs[] = /* Requested printer attributes */
{
"security-enabled",
"printer-info",
"smb-enabled"
- };
+ };
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();
/*
* Ignore printers that cannot be queried without credentials
*/
- if (lastErr == IPP_FORBIDDEN ||
+ if (lastErr == IPP_FORBIDDEN ||
lastErr == IPP_NOT_AUTHENTICATED ||
lastErr == IPP_NOT_AUTHORIZED)
goto out;
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;
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
* 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;
/*
* 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);
}
/*
* disabled for the printer
*/
- if (name != NULL && !secure && smb_enabled)
- pcap_cache_add(name, info);
+ if (name != NULL && !secure && smb_enabled)
+ pcap_cache_add_specific(pcache, name, info, NULL);
}
out:
return(0);
}
-BOOL iprint_cache_reload(void)
+bool iprint_cache_reload(struct pcap_cache **_pcache)
{
http_t *http = NULL; /* HTTP connection to server */
ipp_t *request = NULL, /* IPP Request */
ipp_attribute_t *attr; /* Current attribute */
cups_lang_t *language = NULL; /* Default language */
int i;
- BOOL ret = False;
+ bool ret = false;
+ struct pcap_cache *pcache = NULL;
DEBUG(5, ("reloading iprint printcap cache\n"));
* Try to connect to the server...
*/
- if ((http = httpConnect(iprint_server(), ippPort())) == NULL) {
- DEBUG(0,("Unable to connect to iPrint server %s - %s\n",
+#ifdef HAVE_HTTPCONNECT2
+ http = httpConnect2(iprint_server(),
+ ippPort(),
+ NULL,
+ AF_UNSPEC,
+ HTTP_ENCRYPTION_NEVER,
+ 1, /* blocking */
+ 30 * 1000, /* timeout */
+ NULL);
+#else
+ http = httpConnect(iprint_server(), ippPort());
+#endif
+ if (http == NULL) {
+ DEBUG(0,("Unable to connect to iPrint server %s - %s\n",
iprint_server(), strerror(errno)));
goto out;
}
request = ippNew();
- request->request.op.operation_id = OPERATION_NOVELL_LIST_PRINTERS;
- request->request.op.request_id = 1;
+ ippSetOperation(request, (ipp_op_t)OPERATION_NOVELL_LIST_PRINTERS);
+ ippSetRequestId(request, 1);
language = cupsLangDefault();
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;
* 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;
+ const char *url = ippGetString(attr, i, NULL);
if (!url || !strlen(url))
continue;
- iprint_cache_add_printer(http, i+2, url);
+ iprint_cache_add_printer(http, i+2, url,
+ &pcache);
}
}
- attr = attr->next;
+ attr = ippNextAttribute(response);
}
}
- ret = True;
+ ret = true;
+ *_pcache = pcache;
out:
if (response)
* Try to connect to the server...
*/
- if ((http = httpConnect(iprint_server(), ippPort())) == NULL) {
- DEBUG(0,("Unable to connect to iPrint server %s - %s\n",
+#ifdef HAVE_HTTPCONNECT2
+ http = httpConnect2(iprint_server(),
+ ippPort(),
+ NULL,
+ AF_UNSPEC,
+ HTTP_ENCRYPTION_NEVER,
+ 1, /* blocking */
+ 30 * 1000, /* timeout */
+ NULL);
+#else
+ http = httpConnect(iprint_server(), ippPort());
+#endif
+ if (http == NULL) {
+ DEBUG(0,("Unable to connect to iPrint server %s - %s\n",
iprint_server(), strerror(errno)));
goto out;
}
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();
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 {
cups_lang_t *language = NULL; /* Default language */
char uri[HTTP_MAX_URI]; /* printer-uri attribute */
char httpPath[HTTP_MAX_URI]; /* path portion of the printer-uri */
+ const struct loadparm_substitution *lp_sub =
+ loadparm_s3_global_substitution();
DEBUG(5,("iprint_job_pause(%d, %p (%d))\n", snum, pjob, pjob->sysjob));
* Try to connect to the server...
*/
- if ((http = httpConnect(iprint_server(), ippPort())) == NULL) {
- DEBUG(0,("Unable to connect to iPrint server %s - %s\n",
+#ifdef HAVE_HTTPCONNECT2
+ http = httpConnect2(iprint_server(),
+ ippPort(),
+ NULL,
+ AF_UNSPEC,
+ HTTP_ENCRYPTION_NEVER,
+ 1, /* blocking */
+ 30 * 1000, /* timeout */
+ NULL);
+#else
+ http = httpConnect(iprint_server(), ippPort());
+#endif
+ if (http == NULL) {
+ DEBUG(0,("Unable to connect to iPrint server %s - %s\n",
iprint_server(), strerror(errno)));
goto out;
}
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();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
- slprintf(uri, sizeof(uri) - 1, "ipp://%s/ipp/%s", iprint_server(), PRINTERNAME(snum));
+ slprintf(uri, sizeof(uri) - 1, "ipp://%s/ipp/%s", iprint_server(),
+ lp_printername(talloc_tos(), lp_sub, snum));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
* Do the request and get back a response...
*/
- slprintf(httpPath, sizeof(httpPath) - 1, "/ipp/%s", PRINTERNAME(snum));
+ slprintf(httpPath, sizeof(httpPath) - 1, "/ipp/%s",
+ lp_printername(talloc_tos(), lp_sub, 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 {
cups_lang_t *language = NULL; /* Default language */
char uri[HTTP_MAX_URI]; /* printer-uri attribute */
char httpPath[HTTP_MAX_URI]; /* path portion of the printer-uri */
+ const struct loadparm_substitution *lp_sub =
+ loadparm_s3_global_substitution();
DEBUG(5,("iprint_job_resume(%d, %p (%d))\n", snum, pjob, pjob->sysjob));
* Try to connect to the server...
*/
- if ((http = httpConnect(iprint_server(), ippPort())) == NULL) {
- DEBUG(0,("Unable to connect to iPrint server %s - %s\n",
+#ifdef HAVE_HTTPCONNECT2
+ http = httpConnect2(iprint_server(),
+ ippPort(),
+ NULL,
+ AF_UNSPEC,
+ HTTP_ENCRYPTION_NEVER,
+ 1, /* blocking */
+ 30 * 1000, /* timeout */
+ NULL);
+#else
+ http = httpConnect(iprint_server(), ippPort());
+#endif
+ if (http == NULL) {
+ DEBUG(0,("Unable to connect to iPrint server %s - %s\n",
iprint_server(), strerror(errno)));
goto out;
}
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();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
- slprintf(uri, sizeof(uri) - 1, "ipp://%s/ipp/%s", iprint_server(), PRINTERNAME(snum));
+ slprintf(uri, sizeof(uri) - 1, "ipp://%s/ipp/%s", iprint_server(),
+ lp_printername(talloc_tos(), lp_sub, snum));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
* Do the request and get back a response...
*/
- slprintf(httpPath, sizeof(httpPath) - 1, "/ipp/%s", PRINTERNAME(snum));
+ slprintf(httpPath, sizeof(httpPath) - 1, "/ipp/%s",
+ lp_printername(talloc_tos(), lp_sub, 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 {
* 'iprint_job_submit()' - Submit a job for printing.
*/
-static int iprint_job_submit(int snum, struct printjob *pjob)
+static int iprint_job_submit(int snum, struct printjob *pjob,
+ enum printing_types printing_type,
+ char *lpq_cmd)
{
int ret = 1; /* Return value */
http_t *http = NULL; /* HTTP connection to server */
ipp_attribute_t *attr; /* Current attribute */
cups_lang_t *language = NULL; /* Default language */
char uri[HTTP_MAX_URI]; /* printer-uri attribute */
- char *clientname = NULL; /* hostname of client for job-originating-host attribute */
+ const struct loadparm_substitution *lp_sub =
+ loadparm_s3_global_substitution();
DEBUG(5,("iprint_job_submit(%d, %p (%d))\n", snum, pjob, pjob->sysjob));
* Try to connect to the server...
*/
- if ((http = httpConnect(iprint_server(), ippPort())) == NULL) {
- DEBUG(0,("Unable to connect to iPrint server %s - %s\n",
+#ifdef HAVE_HTTPCONNECT2
+ http = httpConnect2(iprint_server(),
+ ippPort(),
+ NULL,
+ AF_UNSPEC,
+ HTTP_ENCRYPTION_NEVER,
+ 1, /* blocking */
+ 30 * 1000, /* timeout */
+ NULL);
+#else
+ http = httpConnect(iprint_server(), ippPort());
+#endif
+ if (http == NULL) {
+ DEBUG(0,("Unable to connect to iPrint server %s - %s\n",
iprint_server(), strerror(errno)));
goto out;
}
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();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
- slprintf(uri, sizeof(uri) - 1, "ipp://%s/ipp/%s", iprint_server(), PRINTERNAME(snum));
+ slprintf(uri, sizeof(uri) - 1, "ipp://%s/ipp/%s", iprint_server(),
+ lp_printername(talloc_tos(), lp_sub, snum));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI,
"printer-uri", NULL, uri);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
NULL, pjob->user);
- clientname = client_name();
- if (strcmp(clientname, "UNKNOWN") == 0) {
- clientname = client_addr();
- }
-
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME,
"job-originating-host-name", NULL,
- clientname);
+ pjob->clientmachine);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL,
pjob->jobname);
* Do the request and get back a response...
*/
- slprintf(uri, sizeof(uri) - 1, "/ipp/%s", PRINTERNAME(snum));
+ slprintf(uri, sizeof(uri) - 1, "/ipp/%s", lp_printername(talloc_tos(), lp_sub, snum));
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),
+ if (ippGetStatusCode(response) >= IPP_OK_CONFLICT) {
+ DEBUG(0,("Unable to print file to %s - %s\n",
+ lp_printername(talloc_tos(), lp_sub, snum),
ippErrorString(cupsLastError())));
} else {
ret = 0;
}
} else {
- DEBUG(0,("Unable to print file to `%s' - %s\n", PRINTERNAME(snum),
+ DEBUG(0,("Unable to print file to `%s' - %s\n",
+ lp_printername(talloc_tos(), lp_sub, snum),
ippErrorString(cupsLastError())));
}
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);
}
}
static int iprint_queue_get(const char *sharename,
enum printing_types printing_type,
char *lpq_command,
- print_queue_struct **q,
+ print_queue_struct **q,
print_status_struct *status)
{
fstring printername;
int job_id; /* job-id attribute */
int job_k_octets; /* job-k-octets attribute */
time_t job_time; /* time-at-creation attribute */
- time_t printer_current_time = 0; /* printer's current time */
time_t printer_up_time = 0; /* printer's uptime */
ipp_jstate_t job_status; /* job-status attribute */
int job_priority; /* job-priority attribute */
*q = NULL;
- /* HACK ALERT!!! The porblem with support the 'printer name'
- option is that we key the tdb off the sharename. So we will
- overload the lpq_command string to pass in the printername
- (which is basically what we do for non-cups printers ... using
+ /* HACK ALERT!!! The problem with support the 'printer name'
+ option is that we key the tdb off the sharename. So we will
+ overload the lpq_command string to pass in the printername
+ (which is basically what we do for non-cups printers ... using
the lpq_command to get the queue listing). */
fstrcpy( printername, lpq_command );
* Try to connect to the server...
*/
- if ((http = httpConnect(iprint_server(), ippPort())) == NULL) {
- DEBUG(0,("Unable to connect to iPrint server %s - %s\n",
+#ifdef HAVE_HTTPCONNECT2
+ http = httpConnect2(iprint_server(),
+ ippPort(),
+ NULL,
+ AF_UNSPEC,
+ HTTP_ENCRYPTION_NEVER,
+ 1, /* blocking */
+ 30 * 1000, /* timeout */
+ NULL);
+#else
+ http = httpConnect(iprint_server(), ippPort());
+#endif
+ if (http == NULL) {
+ DEBUG(0,("Unable to connect to iPrint server %s - %s\n",
iprint_server(), strerror(errno)));
goto out;
}
/*
* For Linux iPrint servers from OES SP1 on, the iPrint server
* uses Unix time for job start times unless it detects the iPrint
- * client in an http User-Agent header. (This was done to accomodate
+ * client in an http User-Agent header. (This was done to accommodate
* CUPS broken behavior. According to RFC 2911, section 4.3.14, job
* start times are supposed to be relative to how long the printer has
* been up.) Since libcups doesn't allow us to set that header before
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();
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;
}
*/
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;
if ((attr = ippFindAttribute(response, "printer-state-message",
IPP_TAG_TEXT)) != NULL)
- fstrcpy(status->message, attr->values[0].string.text);
-
- if ((attr = ippFindAttribute(response, "printer-current-time",
- IPP_TAG_DATE)) != NULL)
- printer_current_time = ippDateToTime(attr->values[0].date);
+ 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;
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");
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;
}
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;
if (qcount >= qalloc) {
qalloc += 16;
- temp = SMB_REALLOC_ARRAY(queue, print_queue_struct, qalloc);
+ queue = SMB_REALLOC_ARRAY(queue, print_queue_struct, qalloc);
- if (temp == NULL) {
- DEBUG(0,("iprint_queue_get: Not enough memory!"));
+ if (queue == NULL) {
+ DEBUG(0,("iprint_queue_get: Not enough memory!\n"));
qcount = 0;
- SAFE_FREE(queue);
goto out;
}
-
- queue = temp;
}
temp = queue + qcount;
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
*/
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);
}
/*
continue;
}
- temp->job = job_id;
+ temp->sysjob = job_id;
temp->size = job_k_octets * 1024;
temp->status = job_status == IPP_JOB_PENDING ? LPQ_QUEUED :
job_status == IPP_JOB_STOPPED ? LPQ_PAUSED :
static int iprint_queue_pause(int snum)
{
- return(-1); //Not supported without credentials
+ return(-1); /* Not supported without credentials */
}
static int iprint_queue_resume(int snum)
{
- return(-1); //Not supported without credentials
+ return(-1); /* Not supported without credentials */
}
/*******************************************************************
#else
/* this keeps fussy compilers happy */
+ void print_iprint_dummy(void);
void print_iprint_dummy(void) {}
#endif /* HAVE_IPRINT */