summaryrefslogtreecommitdiff
path: root/usr/src/lib/print
diff options
context:
space:
mode:
authorjacobs <none@none>2006-11-15 19:19:07 -0800
committerjacobs <none@none>2006-11-15 19:19:07 -0800
commit0a44ef6d9afbfe052a7e975f55ea0d2954b62a82 (patch)
treeafca18ba6ad0fb467b29e368f05399e53a19ec4a /usr/src/lib/print
parent3383b6dda001791704e0e66f7b78dd0dfe74f547 (diff)
downloadillumos-gate-0a44ef6d9afbfe052a7e975f55ea0d2954b62a82.tar.gz
4634017 Lpadmin's new printer limit needs to be increased.
4941143 lpsched leaks memory in freeprinter() 6480891 lpsched fixes unused files 6486772 in.lpd should use libpapi 6486967 print-svc refers to /usr/sbin/cut 6487898 lpadmin doesn't add remote access 6488443 printmr/lpadmin should prefer IPP support when it's available 6490445 psm-lpd has incorrect mime type in it's translation table 6490453 lpr uses the wrong default mime type 6491971 in.lpd and the ipp listener should detect cycles 6491978 libhttp-core should build when -DDEBUG is specified 6492414 lpstat -o -l should report on requested form when available --HG-- rename : usr/src/cmd/lp/cmd/adaptor/Makefile => deleted_files/usr/src/cmd/lp/cmd/adaptor/Makefile rename : usr/src/cmd/lp/cmd/adaptor/cancel_job.c => deleted_files/usr/src/cmd/lp/cmd/adaptor/cancel_job.c rename : usr/src/cmd/lp/cmd/adaptor/misc.c => deleted_files/usr/src/cmd/lp/cmd/adaptor/misc.c rename : usr/src/cmd/lp/cmd/adaptor/misc.h => deleted_files/usr/src/cmd/lp/cmd/adaptor/misc.h rename : usr/src/cmd/lp/cmd/adaptor/show_queue.c => deleted_files/usr/src/cmd/lp/cmd/adaptor/show_queue.c rename : usr/src/cmd/lp/cmd/adaptor/submit_job.c => deleted_files/usr/src/cmd/lp/cmd/adaptor/submit_job.c rename : usr/src/cmd/print/gateway/Makefile => deleted_files/usr/src/cmd/print/gateway/Makefile rename : usr/src/cmd/print/gateway/adaptor.c => deleted_files/usr/src/cmd/print/gateway/adaptor.c rename : usr/src/cmd/print/gateway/adaptor.h => deleted_files/usr/src/cmd/print/gateway/adaptor.h rename : usr/src/cmd/print/gateway/cleanup.xml => deleted_files/usr/src/cmd/print/gateway/cleanup.xml rename : usr/src/cmd/print/gateway/main.c => deleted_files/usr/src/cmd/print/gateway/main.c rename : usr/src/cmd/print/gateway/print-cleanup => deleted_files/usr/src/cmd/print/gateway/print-cleanup rename : usr/src/cmd/print/gateway/printd.c => deleted_files/usr/src/cmd/print/gateway/printd.c rename : usr/src/cmd/print/gateway/translators/Makefile => deleted_files/usr/src/cmd/print/gateway/translators/Makefile rename : usr/src/cmd/print/gateway/translators/cascade/Makefile => deleted_files/usr/src/cmd/print/gateway/translators/cascade/Makefile rename : usr/src/cmd/print/gateway/translators/cascade/cascade.c => deleted_files/usr/src/cmd/print/gateway/translators/cascade/cascade.c rename : usr/src/cmd/print/gateway/translators/test/Makefile => deleted_files/usr/src/cmd/print/gateway/translators/test/Makefile rename : usr/src/cmd/print/gateway/translators/test/README => deleted_files/usr/src/cmd/print/gateway/translators/test/README rename : usr/src/cmd/print/gateway/translators/test/test.c => deleted_files/usr/src/cmd/print/gateway/translators/test/test.c rename : usr/src/cmd/print/gateway/rfc1179.xml => usr/src/cmd/print/bsd-sysv-commands/rfc1179.xml
Diffstat (limited to 'usr/src/lib/print')
-rw-r--r--usr/src/lib/print/libhttp-core/common/http.c2
-rw-r--r--usr/src/lib/print/libhttp-core/common/http.h3
-rw-r--r--usr/src/lib/print/libipp-listener/common/ipp-listener.c68
-rw-r--r--usr/src/lib/print/libpapi-common/common/attribute.c2
-rw-r--r--usr/src/lib/print/libpapi-common/common/common.c3
-rw-r--r--usr/src/lib/print/libpapi-common/common/list.c52
-rw-r--r--usr/src/lib/print/libpapi-common/common/mapfile4
-rw-r--r--usr/src/lib/print/libpapi-common/common/papi.h2
-rw-r--r--usr/src/lib/print/libpapi-dynamic/common/mapfile2
-rw-r--r--usr/src/lib/print/libpapi-ipp/common/ipp-support.c2
-rw-r--r--usr/src/lib/print/libpapi-ipp/common/mapfile2
-rw-r--r--usr/src/lib/print/libpapi-lpd/common/lpd-job.c4
-rw-r--r--usr/src/lib/print/libpapi-lpd/common/mapfile2
13 files changed, 124 insertions, 24 deletions
diff --git a/usr/src/lib/print/libhttp-core/common/http.c b/usr/src/lib/print/libhttp-core/common/http.c
index 83a0790022..b32b1eb3bc 100644
--- a/usr/src/lib/print/libhttp-core/common/http.c
+++ b/usr/src/lib/print/libhttp-core/common/http.c
@@ -191,7 +191,7 @@ static const char * const months[12] =
};
void
-httpDumpData(FILE *fp, char *tag, char *buffer, int bytes)
+httpDumpData(FILE *fp, const char *tag, const char *buffer, int bytes)
{
int i, j, ch;
diff --git a/usr/src/lib/print/libhttp-core/common/http.h b/usr/src/lib/print/libhttp-core/common/http.h
index da36b461a3..593b7b68f6 100644
--- a/usr/src/lib/print/libhttp-core/common/http.h
+++ b/usr/src/lib/print/libhttp-core/common/http.h
@@ -420,6 +420,9 @@ extern char *httpAddrLookup(const http_addr_t *addr,
extern char *httpAddrString(const http_addr_t *addr,
char *s, int slen);
+#include <stdio.h>
+extern void httpDumpData(FILE *, const char *, const char *, int);
+
/*
* C++ magic...
diff --git a/usr/src/lib/print/libipp-listener/common/ipp-listener.c b/usr/src/lib/print/libipp-listener/common/ipp-listener.c
index 9163ddffa3..fc46366ea0 100644
--- a/usr/src/lib/print/libipp-listener/common/ipp-listener.c
+++ b/usr/src/lib/print/libipp-listener/common/ipp-listener.c
@@ -39,9 +39,12 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
+#include <unistd.h>
+#include <sys/systeminfo.h>
#include <papi.h>
#include <ipp-listener.h>
+#include <uri.h>
typedef papi_status_t (ipp_handler_t)(papi_service_t svc,
papi_attribute_t **request,
@@ -360,6 +363,61 @@ ipp_initialize_response(papi_attribute_t **request,
return (PAPI_OK);
}
+/* simplistic check for cyclical service references */
+static int
+cyclical_service_check(char *svc_name, int port)
+{
+ papi_attribute_t **list;
+ char buf[BUFSIZ];
+ uri_t *uri = NULL;
+ char *s = NULL;
+
+ /* was there a service_uri? */
+ if (svc_name == NULL)
+ return (0);
+
+ if ((list = getprinterbyname(svc_name, NULL)) == NULL)
+ return (0); /* if it doesnt' resolve, we will fail later */
+
+ papiAttributeListGetString(list, NULL, "printer-uri-supported", &s);
+ if ((s == NULL) || (strcasecmp(svc_name, s) != 0))
+ return (0); /* they don't match */
+
+ /* is it in uri form? */
+ if (uri_from_string(s, &uri) < 0)
+ return (0);
+
+ if ((uri == NULL) || (uri->scheme == NULL) || (uri->host == NULL)) {
+ uri_free(uri);
+ return (0);
+ }
+
+ /* is it ipp form */
+ if (strcasecmp(uri->scheme, "ipp") != 0) {
+ uri_free(uri);
+ return (0);
+ }
+
+ /* does the host match up */
+ sysinfo(SI_HOSTNAME, buf, sizeof (buf));
+ if ((strcasecmp(uri->host, "localhost") != 0) &&
+ (strcasecmp(uri->host, buf) != 0)) {
+ uri_free(uri);
+ return (0);
+ }
+
+ /* does the port match our own */
+ if (((uri->port == NULL) && (port != 631)) ||
+ ((uri->port != NULL) && (atoi(uri->port) != port))) {
+ uri_free(uri);
+ return (0);
+ }
+
+ uri_free(uri);
+
+ return (1);
+}
+
static papi_status_t
print_service_connect(papi_service_t *svc, papi_attribute_t **request,
papi_attribute_t ***response)
@@ -369,6 +427,7 @@ print_service_connect(papi_service_t *svc, papi_attribute_t **request,
char *printer_uri = NULL;
char *svc_name = NULL;
char *user = NULL;
+ int port = 631;
/* Get the operational attributes group from the request */
(void) papiAttributeListGetCollection(request, NULL,
@@ -384,6 +443,15 @@ print_service_connect(papi_service_t *svc, papi_attribute_t **request,
"default-service", &svc_name);
get_printer_id(operational, &svc_name, NULL);
+ /* get the port that we are listening on */
+ (void) papiAttributeListGetInteger(request, NULL, "uri-port", &port);
+
+ if (cyclical_service_check(svc_name, port) != 0) {
+ status = PAPI_NOT_POSSIBLE;
+ ipp_set_status(response, status, "printer-uri is cyclical");
+ return (status);
+ }
+
status = papiServiceCreate(svc, svc_name, user, NULL, NULL,
PAPI_ENCRYPT_NEVER, NULL);
if (status != PAPI_OK) {
diff --git a/usr/src/lib/print/libpapi-common/common/attribute.c b/usr/src/lib/print/libpapi-common/common/attribute.c
index 2b2e035cfe..4fd9f01a19 100644
--- a/usr/src/lib/print/libpapi-common/common/attribute.c
+++ b/usr/src/lib/print/libpapi-common/common/attribute.c
@@ -387,7 +387,7 @@ papiAttributeListDelete(papi_attribute_t ***list, char *name)
if ((attribute = papiAttributeListFind(*list, name)) == NULL)
return (PAPI_NOT_FOUND);
- list_remove(*list, attribute);
+ list_remove(list, attribute);
papiAttributeFree(attribute);
return (PAPI_OK);
diff --git a/usr/src/lib/print/libpapi-common/common/common.c b/usr/src/lib/print/libpapi-common/common/common.c
index 318b1d2c83..c14515417b 100644
--- a/usr/src/lib/print/libpapi-common/common/common.c
+++ b/usr/src/lib/print/libpapi-common/common/common.c
@@ -130,3 +130,6 @@ papiJobGetId(papi_job_t job)
#pragma weak papiJobGetJobTicket = _unsupported_null_return
#pragma weak papiJobFree = _unsupported_no_return
#pragma weak papiJobListFree = _unsupported_no_return
+
+/* private functions */
+#pragma weak getprinterbyname = _unsupported_null_return
diff --git a/usr/src/lib/print/libpapi-common/common/list.c b/usr/src/lib/print/libpapi-common/common/list.c
index 9ed0d2ded2..ddd29a76df 100644
--- a/usr/src/lib/print/libpapi-common/common/list.c
+++ b/usr/src/lib/print/libpapi-common/common/list.c
@@ -60,6 +60,8 @@ list_append(void ***list, void *item)
__list_increment;
new_list = (void **)calloc(new_size, sizeof (void *));
+ if (new_list == NULL)
+ return (-1);
for (count = 0; (*list)[count] != NULL; count++)
new_list[count] = (*list)[count];
@@ -136,26 +138,36 @@ list_locate(void **list, int (*compare)(void *, void *), void *element)
}
void
-list_remove(void **list, void *item)
+list_remove(void ***list, void *item)
{
- int i, last;
-
- if ((list == NULL) || (*list == NULL) || (item == NULL))
- return;
-
- for (last = 0; list[last] != NULL; last++)
- ;
- --last;
-
- /*
- * This doesn't preserve order, and doesn't shrink the allocation if we
- * go below % __list_increment == 0. <shrug>
- */
- for (i = 0; list[i] != NULL; i++) {
- if (list[i] == item) {
- list[i] = list[last];
- list[last] = NULL;
- break;
- }
+ int i, count;
+ void **tmp = NULL;
+
+ if ((list == NULL) || (*list == NULL) || (item == NULL))
+ return;
+
+ for (count = 0; (*list)[count] != NULL; count++)
+ ;
+
+ if (count > 0) {
+ int new_size = (((count + 1) / __list_increment) + 1) *
+ __list_increment;
+
+ if ((tmp = (void **)calloc(new_size, sizeof (void *))) != NULL)
+ tmp = *list;
+
+ /* copy up to item */
+ for (i = 0; (((*list)[i] != NULL) && ((*list)[i] != item)); i++)
+ tmp[i] = (*list)[i];
+ /* copy after item */
+ if ((*list)[i] == item)
+ for (++i; ((*list)[i] != NULL); i++)
+ tmp[i-1] = (*list)[i];
+ }
+
+ /* replace the list */
+ if (tmp != *list) {
+ free(*list);
+ *list = tmp;
}
}
diff --git a/usr/src/lib/print/libpapi-common/common/mapfile b/usr/src/lib/print/libpapi-common/common/mapfile
index a187eb4da8..729e6f3abb 100644
--- a/usr/src/lib/print/libpapi-common/common/mapfile
+++ b/usr/src/lib/print/libpapi-common/common/mapfile
@@ -134,11 +134,15 @@ SUNWprivate_1.0 { # Misc. semi-private supporting calls
uri_from_string;
uri_to_string;
uri_free;
+
# list
list_remove;
list_append;
list_concatenate;
+ # NS
+ getprinterbyname;
+
# extra Attribute Calls
copy_attributes;
split_and_copy_attributes;
diff --git a/usr/src/lib/print/libpapi-common/common/papi.h b/usr/src/lib/print/libpapi-common/common/papi.h
index 7c1d891eb2..b84e7904ac 100644
--- a/usr/src/lib/print/libpapi-common/common/papi.h
+++ b/usr/src/lib/print/libpapi-common/common/papi.h
@@ -441,6 +441,8 @@ extern void split_and_copy_attributes(char **list,
papi_attribute_t ***in,
papi_attribute_t ***out);
+extern papi_attribute_t **getprinterbyname(char *name, char *ns);
+
#ifdef __cplusplus
}
#endif
diff --git a/usr/src/lib/print/libpapi-dynamic/common/mapfile b/usr/src/lib/print/libpapi-dynamic/common/mapfile
index 2cd1ca7fe4..41734836cb 100644
--- a/usr/src/lib/print/libpapi-dynamic/common/mapfile
+++ b/usr/src/lib/print/libpapi-dynamic/common/mapfile
@@ -139,6 +139,8 @@ SUNWprivate_1.0 {
list_remove = FUNCTION FILTER libpapi-common.so ;
list_append = FUNCTION FILTER libpapi-common.so ;
list_concatenate = FUNCTION FILTER libpapi-common.so ;
+ # NS
+ getprinterbyname ;
# extra Attribute Calls
copy_attributes = FUNCTION FILTER libpapi-common.so ;
diff --git a/usr/src/lib/print/libpapi-ipp/common/ipp-support.c b/usr/src/lib/print/libpapi-ipp/common/ipp-support.c
index f0f6ced38d..9e648de23c 100644
--- a/usr/src/lib/print/libpapi-ipp/common/ipp-support.c
+++ b/usr/src/lib/print/libpapi-ipp/common/ipp-support.c
@@ -40,6 +40,8 @@
#include <config-site.h>
+#include <ipp.h>
+
papi_status_t
http_to_papi_status(http_status_t status)
{
diff --git a/usr/src/lib/print/libpapi-ipp/common/mapfile b/usr/src/lib/print/libpapi-ipp/common/mapfile
index ca9a53f0a4..918398aa74 100644
--- a/usr/src/lib/print/libpapi-ipp/common/mapfile
+++ b/usr/src/lib/print/libpapi-ipp/common/mapfile
@@ -139,6 +139,8 @@ SUNWprivate_1.0 {
list_remove = FUNCTION FILTER libpapi-common.so ;
list_append = FUNCTION FILTER libpapi-common.so ;
list_concatenate = FUNCTION FILTER libpapi-common.so ;
+ # NS
+ getprinterbyname = FUNCTION FILTER libpapi-common.so ;
# extra Attribute Calls
copy_attributes = FUNCTION FILTER libpapi-common.so ;
diff --git a/usr/src/lib/print/libpapi-lpd/common/lpd-job.c b/usr/src/lib/print/libpapi-lpd/common/lpd-job.c
index 3d36fef99d..6d9976825f 100644
--- a/usr/src/lib/print/libpapi-lpd/common/lpd-job.c
+++ b/usr/src/lib/print/libpapi-lpd/common/lpd-job.c
@@ -49,7 +49,7 @@ static char
mime_type_to_rfc1179_type(char *mime)
{
static struct { char *mime; char rfc; } cvt[] = {
- { "plain/text", 'f' },
+ { "text/plain", 'f' },
{ "application/octet-stream", 'l' },
{ "application/postscript", 'f' }, /* rfc incorrectly has 'o' */
{ "application/x-pr", 'p' },
@@ -422,7 +422,7 @@ papi_status_t
lpd_job_add_files(service_t *svc, papi_attribute_t **attributes,
char **files, char **metadata, papi_attribute_t ***used)
{
- char *format = "plain/text";
+ char *format = "text/plain";
char rfc_fmt = 'l';
int copies = 1;
char host[BUFSIZ];
diff --git a/usr/src/lib/print/libpapi-lpd/common/mapfile b/usr/src/lib/print/libpapi-lpd/common/mapfile
index d21b349ff7..257a97becf 100644
--- a/usr/src/lib/print/libpapi-lpd/common/mapfile
+++ b/usr/src/lib/print/libpapi-lpd/common/mapfile
@@ -139,6 +139,8 @@ SUNWprivate_1.0 {
list_remove = FUNCTION FILTER libpapi-common.so ;
list_append = FUNCTION FILTER libpapi-common.so ;
list_concatenate = FUNCTION FILTER libpapi-common.so ;
+ # NS
+ getprinterbyname = FUNCTION FILTER libpapi-common.so ;
# extra Attribute Calls
copy_attributes = FUNCTION FILTER libpapi-common.so ;