diff options
author | Karolin Seeger <kseeger@samba.org> | 2008-11-17 14:02:49 +0100 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2008-11-17 14:02:49 +0100 |
commit | 1e0e3aa442502cdcdb083893fba8489f40d22312 (patch) | |
tree | f0ed5801a14e620ba41384e072bf7c00ff3e159b /source/printing | |
parent | 2c36721294d3924d66225307524c848ff405ab86 (diff) | |
download | samba-1e0e3aa442502cdcdb083893fba8489f40d22312.tar.gz samba-1e0e3aa442502cdcdb083893fba8489f40d22312.tar.xz samba-1e0e3aa442502cdcdb083893fba8489f40d22312.zip |
Revert "Now it's working, back port the aync fix for parsing large cups printer lists."
This reverts commit f5f7ed4041ef986a5ce208d59bbf39d34373ce71.
Diffstat (limited to 'source/printing')
-rw-r--r-- | source/printing/load.c | 2 | ||||
-rw-r--r-- | source/printing/pcap.c | 77 | ||||
-rw-r--r-- | source/printing/print_cups.c | 262 |
3 files changed, 31 insertions, 310 deletions
diff --git a/source/printing/load.c b/source/printing/load.c index fc21f271bd9..23144d5a955 100644 --- a/source/printing/load.c +++ b/source/printing/load.c @@ -60,5 +60,5 @@ void load_printers(void) /* load all printcap printers */ if (lp_load_printers() && lp_servicenumber(PRINTERS_NAME) >= 0) - pcap_printer_fn(lp_add_one_printer, NULL); + pcap_printer_fn(lp_add_one_printer); } diff --git a/source/printing/pcap.c b/source/printing/pcap.c index 10c1a2d608b..30cb254a29a 100644 --- a/source/printing/pcap.c +++ b/source/printing/pcap.c @@ -63,51 +63,41 @@ #include "includes.h" -struct pcap_cache { +typedef struct pcap_cache { char *name; char *comment; struct pcap_cache *next; -}; +} pcap_cache_t; -/* The systemwide printcap cache. */ -static struct pcap_cache *pcap_cache = NULL; +static pcap_cache_t *pcap_cache = NULL; -bool pcap_cache_add_specific(struct pcap_cache **ppcache, const char *name, const char *comment) +bool pcap_cache_add(const char *name, const char *comment) { - struct pcap_cache *p; + pcap_cache_t *p; - if (name == NULL || ((p = SMB_MALLOC_P(struct pcap_cache)) == NULL)) - return false; + if (name == NULL || ((p = SMB_MALLOC_P(pcap_cache_t)) == NULL)) + return False; p->name = SMB_STRDUP(name); p->comment = (comment && *comment) ? SMB_STRDUP(comment) : NULL; - DEBUG(11,("pcap_cache_add_specific: Adding name %s info %s\n", - p->name, p->comment ? p->comment : "")); - - p->next = *ppcache; - *ppcache = p; + p->next = pcap_cache; + pcap_cache = p; - return true; + return True; } -void pcap_cache_destroy_specific(struct pcap_cache **pp_cache) +static void pcap_cache_destroy(pcap_cache_t *cache) { - struct pcap_cache *p, *next; + pcap_cache_t *p, *next; - for (p = *pp_cache; p != NULL; p = next) { + for (p = cache; p != NULL; p = next) { next = p->next; SAFE_FREE(p->name); SAFE_FREE(p->comment); SAFE_FREE(p); } - *pp_cache = NULL; -} - -bool pcap_cache_add(const char *name, const char *comment) -{ - return pcap_cache_add_specific(&pcap_cache, name, comment); } bool pcap_cache_loaded(void) @@ -115,21 +105,11 @@ bool pcap_cache_loaded(void) return (pcap_cache != NULL); } -void pcap_cache_replace(const struct pcap_cache *pcache) -{ - const struct pcap_cache *p; - - pcap_cache_destroy_specific(&pcap_cache); - for (p = pcache; p; p = p->next) { - pcap_cache_add(p->name, p->comment); - } -} - void pcap_cache_reload(void) { const char *pcap_name = lp_printcapname(); bool pcap_reloaded = False; - struct pcap_cache *tmp_cache = NULL; + pcap_cache_t *tmp_cache = NULL; XFILE *pcap_file; char *pcap_line; @@ -243,9 +223,9 @@ done: DEBUG(3, ("reload status: %s\n", (pcap_reloaded) ? "ok" : "error")); if (pcap_reloaded) - pcap_cache_destroy_specific(&tmp_cache); + pcap_cache_destroy(tmp_cache); else { - pcap_cache_destroy_specific(&pcap_cache); + pcap_cache_destroy(pcap_cache); pcap_cache = tmp_cache; } @@ -255,7 +235,7 @@ done: bool pcap_printername_ok(const char *printername) { - struct pcap_cache *p; + pcap_cache_t *p; for (p = pcap_cache; p != NULL; p = p->next) if (strequal(p->name, printername)) @@ -265,22 +245,19 @@ bool pcap_printername_ok(const char *printername) } /*************************************************************************** -run a function on each printer name in the printcap file. -***************************************************************************/ +run a function on each printer name in the printcap file. The function is +passed the primary name and the comment (if possible). Note the fn() takes +strings in DOS codepage. This means the xxx_printer_fn() calls must be fixed +to return DOS codepage. FIXME !! JRA. -void pcap_printer_fn_specific(const struct pcap_cache *pc, - void (*fn)(const char *, const char *, void *), - void *pdata) +XXX: I'm not sure if this comment still applies.. Anyone? -Rob +***************************************************************************/ +void pcap_printer_fn(void (*fn)(char *, char *)) { - const struct pcap_cache *p; + pcap_cache_t *p; - for (p = pc; p != NULL; p = p->next) - fn(p->name, p->comment, pdata); + for (p = pcap_cache; p != NULL; p = p->next) + fn(p->name, p->comment); return; } - -void pcap_printer_fn(void (*fn)(const char *, const char *, void *), void *pdata) -{ - return pcap_printer_fn_specific(pcap_cache, fn, pdata); -} diff --git a/source/printing/print_cups.c b/source/printing/print_cups.c index 8d32ddbc71e..0be65a58bef 100644 --- a/source/printing/print_cups.c +++ b/source/printing/print_cups.c @@ -82,46 +82,9 @@ static http_t *cups_connect(TALLOC_CTX *frame) return http; } -static void send_pcap_info(const char *name, const char *info, void *pd) -{ - int fd = *(int *)pd; - size_t namelen = name ? strlen(name)+1 : 0; - size_t infolen = info ? strlen(info)+1 : 0; - - DEBUG(11,("send_pcap_info: writing namelen %u\n", (unsigned int)namelen)); - if (sys_write(fd, &namelen, sizeof(namelen)) != sizeof(namelen)) { - DEBUG(10,("send_pcap_info: namelen write failed %s\n", - strerror(errno))); - return; - } - DEBUG(11,("send_pcap_info: writing infolen %u\n", (unsigned int)infolen)); - if (sys_write(fd, &infolen, sizeof(infolen)) != sizeof(infolen)) { - DEBUG(10,("send_pcap_info: infolen write failed %s\n", - strerror(errno))); - return; - } - if (namelen) { - DEBUG(11,("send_pcap_info: writing name %s\n", name)); - if (sys_write(fd, name, namelen) != namelen) { - DEBUG(10,("send_pcap_info: name write failed %s\n", - strerror(errno))); - return; - } - } - if (infolen) { - DEBUG(11,("send_pcap_info: writing info %s\n", info)); - if (sys_write(fd, info, infolen) != infolen) { - DEBUG(10,("send_pcap_info: info write failed %s\n", - strerror(errno))); - return; - } - } -} - -static bool cups_cache_reload_async(int fd) +bool cups_cache_reload(void) { TALLOC_CTX *frame = talloc_stackframe(); - struct pcap_cache *tmp_pcap_cache = NULL; http_t *http = NULL; /* HTTP connection to server */ ipp_t *request = NULL, /* IPP Request */ *response = NULL; /* IPP Response */ @@ -232,7 +195,7 @@ static bool cups_cache_reload_async(int fd) if (name == NULL) break; - if (!pcap_cache_add_specific(&tmp_pcap_cache, name, info)) { + if (!pcap_cache_add(name, info)) { goto out; } } @@ -318,7 +281,7 @@ static bool cups_cache_reload_async(int fd) if (name == NULL) break; - if (!pcap_cache_add_specific(&tmp_pcap_cache, name, info)) { + if (!pcap_cache_add(name, info)) { goto out; } } @@ -335,229 +298,10 @@ static bool cups_cache_reload_async(int fd) if (http) httpClose(http); - /* Send all the entries up the pipe. */ - if (tmp_pcap_cache) { - pcap_printer_fn_specific(tmp_pcap_cache, - send_pcap_info, - (void *)&fd); - - pcap_cache_destroy_specific(&tmp_pcap_cache); - } TALLOC_FREE(frame); return ret; } -static struct pcap_cache *local_pcap_copy; -struct fd_event *cache_fd_event; - -static bool cups_pcap_load_async(int *pfd) -{ - int fds[2]; - pid_t pid; - - *pfd = -1; - - if (cache_fd_event) { - DEBUG(3,("cups_pcap_load_async: already waiting for " - "a refresh event\n" )); - return false; - } - - DEBUG(5,("cups_pcap_load_async: asynchronously loading cups printers\n")); - - if (pipe(fds) == -1) { - return false; - } - - pid = sys_fork(); - if (pid == (pid_t)-1) { - DEBUG(10,("cups_pcap_load_async: fork failed %s\n", - strerror(errno) )); - close(fds[0]); - close(fds[1]); - return false; - } - - if (pid) { - DEBUG(10,("cups_pcap_load_async: child pid = %u\n", - (unsigned int)pid )); - /* Parent. */ - close(fds[1]); - *pfd = fds[0]; - return true; - } - - /* Child. */ - if (!reinit_after_fork(smbd_messaging_context(), true)) { - DEBUG(0,("cups_pcap_load_async: reinit_after_fork() failed\n")); - smb_panic("cups_pcap_load_async: reinit_after_fork() failed"); - } - - close(fds[0]); - cups_cache_reload_async(fds[1]); - close(fds[1]); - _exit(0); -} - -static void cups_async_callback(struct event_context *event_ctx, - struct fd_event *event, - uint16 flags, - void *p) -{ - TALLOC_CTX *frame = talloc_stackframe(); - int fd = *(int *)p; - struct pcap_cache *tmp_pcap_cache = NULL; - - DEBUG(5,("cups_async_callback: callback received for printer data. " - "fd = %d\n", fd)); - - while (1) { - char *name = NULL, *info = NULL; - size_t namelen = 0, infolen = 0; - ssize_t ret = -1; - - ret = sys_read(fd, &namelen, sizeof(namelen)); - if (ret == 0) { - /* EOF */ - break; - } - if (ret != sizeof(namelen)) { - DEBUG(10,("cups_async_callback: namelen read failed %d %s\n", - errno, strerror(errno))); - break; - } - - DEBUG(11,("cups_async_callback: read namelen %u\n", - (unsigned int)namelen)); - - ret = sys_read(fd, &infolen, sizeof(infolen)); - if (ret == 0) { - /* EOF */ - break; - } - if (ret != sizeof(infolen)) { - DEBUG(10,("cups_async_callback: infolen read failed %s\n", - strerror(errno))); - break; - } - - DEBUG(11,("cups_async_callback: read infolen %u\n", - (unsigned int)infolen)); - - if (namelen) { - name = TALLOC_ARRAY(frame, char, namelen); - if (!name) { - break; - } - ret = sys_read(fd, name, namelen); - if (ret == 0) { - /* EOF */ - break; - } - if (ret != namelen) { - DEBUG(10,("cups_async_callback: name read failed %s\n", - strerror(errno))); - break; - } - DEBUG(11,("cups_async_callback: read name %s\n", - name)); - } else { - name = NULL; - } - if (infolen) { - info = TALLOC_ARRAY(frame, char, infolen); - if (!info) { - break; - } - ret = sys_read(fd, info, infolen); - if (ret == 0) { - /* EOF */ - break; - } - if (ret != infolen) { - DEBUG(10,("cups_async_callback: info read failed %s\n", - strerror(errno))); - break; - } - DEBUG(11,("cups_async_callback: read info %s\n", - info)); - } else { - info = NULL; - } - - /* Add to our local pcap cache. */ - pcap_cache_add_specific(&tmp_pcap_cache, name, info); - TALLOC_FREE(name); - TALLOC_FREE(info); - } - - TALLOC_FREE(frame); - if (tmp_pcap_cache) { - /* We got a namelist, replace our local cache. */ - pcap_cache_destroy_specific(&local_pcap_copy); - local_pcap_copy = tmp_pcap_cache; - - /* And the systemwide pcap cache. */ - pcap_cache_replace(local_pcap_copy); - } else { - DEBUG(2,("cups_async_callback: failed to read a new " - "printer list\n")); - } - close(fd); - TALLOC_FREE(p); - TALLOC_FREE(cache_fd_event); -} - -bool cups_cache_reload(void) -{ - int *p_pipe_fd = TALLOC_P(NULL, int); - - if (!p_pipe_fd) { - return false; - } - - *p_pipe_fd = -1; - - /* Set up an async refresh. */ - if (!cups_pcap_load_async(p_pipe_fd)) { - return false; - } - if (!local_pcap_copy) { - /* We have no local cache, wait directly for - * async refresh to complete. - */ - DEBUG(10,("cups_cache_reload: sync read on fd %d\n", - *p_pipe_fd )); - - cups_async_callback(smbd_event_context(), - NULL, - EVENT_FD_READ, - (void *)p_pipe_fd); - if (!local_pcap_copy) { - return false; - } - } else { - /* Replace the system cache with our - * local copy. */ - pcap_cache_replace(local_pcap_copy); - - DEBUG(10,("cups_cache_reload: async read on fd %d\n", - *p_pipe_fd )); - - /* Trigger an event when the pipe can be read. */ - cache_fd_event = event_add_fd(smbd_event_context(), - NULL, *p_pipe_fd, - EVENT_FD_READ, - cups_async_callback, - (void *)p_pipe_fd); - if (!cache_fd_event) { - close(*p_pipe_fd); - TALLOC_FREE(p_pipe_fd); - return false; - } - } - return true; -} /* * 'cups_job_delete()' - Delete a job. |