diff options
Diffstat (limited to 'Build/source/texk/xdvik/browser.c')
-rw-r--r-- | Build/source/texk/xdvik/browser.c | 279 |
1 files changed, 0 insertions, 279 deletions
diff --git a/Build/source/texk/xdvik/browser.c b/Build/source/texk/xdvik/browser.c deleted file mode 100644 index 59a1d227377..00000000000 --- a/Build/source/texk/xdvik/browser.c +++ /dev/null @@ -1,279 +0,0 @@ -/* routines for launching a browser to retrieve remote documents. - * Copyright(C) 2002-2004 the xdvik development team. - */ -/* - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL PAUL VOJTA OR ANY OTHER AUTHOR OF THIS SOFTWARE BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include "xdvi-config.h" -#include "xdvi.h" - -#include <ctype.h> -#include "kpathsea/c-fopen.h" -#include "kpathsea/c-stat.h" - -#include <sys/types.h> -#include <sys/wait.h> /* for waitpid(), WEXITSTATUS */ - -#include "util.h" -#include "message-window.h" -#include "events.h" -#include "browser.h" -#include "string-utils.h" -#include "statusline.h" - -static const char *const default_browser_cmd = -"xdg-open %s" -":htmlview %s" -":firefox -remote \"openURL(%s,new-window)\"" -":mozilla -remote \"openURL(%s,new-window)\"" -":netscape -remote \"openURL(%s,new-window)\"" -":xterm -e w3m %s" -":xterm -e lynx %s" -":xterm -e wget %s"; - -static Boolean -do_fork_browser(char *argv[]) -{ - pid_t pid; - switch(pid = vfork()) { - case -1: /* forking error */ - perror("fork"); - return False; - case 0: /* child */ - execvp(argv[0], argv); - /* arrive here only if execvp failed */ - XDVI_ERROR((stderr, "Execution of %s failed: %s", argv[0], strerror(errno))); - _exit(EXIT_FAILURE); - return False; /* notreached - make compiler happy */ - default: /* parent */ - { - int timeout; - for (timeout = 0; timeout < 15; timeout++) { - int status; - if (waitpid(pid, &status, WNOHANG)) { - TRACE_HTEX((stderr, "waiting for %d: %d", (int)pid, status)); - if (WIFEXITED(status)) { - if (WEXITSTATUS(status) != 0) { - fprintf(stderr, "Command `%s' exited with error status %d\n", - argv[0], WEXITSTATUS(status)); - return False; - } - else { - TRACE_HTEX((stderr, "Child exited OK.")); - return True; - } - } - else { /* when do we arrive here?? */ - sleep(1); - } - } - else { /* waiting for child to finish */ - sleep(1); - } - } - return True; /* child not finished in time */ - } - } -} - -static Boolean -fork_browser(const char *browser, const char *url) -{ - char *cmd, *orig_cmd, *last_arg; - char **argv = NULL; - int argv_len = 0; - int i = 0, j = 0; - int match = 0; - int retval; - - - cmd = xmalloc(strlen(browser) + strlen(url) + 1); - orig_cmd = cmd; /* for freeing it later */ - last_arg = cmd; - - /* skip over leading space */ - while (isspace((int)browser[i])) - i++; - - while (browser[i] != '\0') { - while (j >= argv_len) { - argv_len += 10; - argv = xrealloc(argv, argv_len * sizeof *argv); - } - /* chop into separate arguments at spaces */ - if (isspace((int)browser[i])) { - *cmd++ = '\0'; - argv[j++] = format_arg(last_arg, url, &match); - last_arg = cmd; - /* skip over multiple spaces */ - while (isspace((int)browser[i])) - i++; - } - /* remove quotes around arguments containing spaces */ - else if (browser[i] == '\'' || browser[i] == '"') { - int len = 0; - /* normalize %% and replace %s by URL */ - argv[j++] = unquote_arg(browser+i, url, &match, &len); - if (len == 0) { /* excess quote at end of arg; try to recover: */ - j--; - break; - } - i += len + 1; - } - else { - *cmd++ = browser[i++]; - } - } - *cmd = browser[i]; /* null-teminate */ - /* append last, unless it contained only skipped spaces */ - if (strlen(last_arg) > 0) { - argv[j++] = format_arg(last_arg, url, &match); - } - - if (match == 0) - argv[j++] = xstrdup(url); - argv[j++] = NULL; - - for (i = 0; argv[i] != NULL; i++) { - TRACE_HTEX((stderr, "arg[%d]: |%s|", i, argv[i])); - } - - /* This will wait for child exits: */ - retval = do_fork_browser(argv); - for (i = 0; argv[i] != NULL; i++) - free(argv[i]); - free(orig_cmd); - free(argv); - return retval; -} - -void -launch_browser(const char *filename) -{ - const char *browser; - int pid; - struct xchild *my_child; - struct xio *my_io; - int err_pipe[2]; - - /* try to set it from possible resources: First command-line argument - or X resource, then environment variables, then default_browser_cmd - */ - for (;;) { - if ((browser = resource.browser) != NULL) - break; - if ((browser = getenv("BROWSER")) != NULL) - break; - if ((browser = getenv("WWWBROWSER")) != NULL) - break; - XDVI_INFO((stderr, "Browser not set (xdvi.wwwBrowser, -browser or $BROWSER environment variable).")); - XDVI_INFO((stderr, "Using built-in default: `%s'", - default_browser_cmd)); - browser = default_browser_cmd; - break; - } - - /* fork first time so that we can wait for children, without - freezing the GUI. FIXME: this copies stuff from - fork_process for the inter-process communication stuff - - it would be better to have this in one function. */ - my_child = xmalloc(sizeof *my_child); - my_io = xmalloc(sizeof *my_io); - statusline_info(STATUS_MEDIUM, "Trying to launch browser ..."); - /* flush output buffers to avoid double buffering (i.e. data - waiting in the output buffer being written twice, by the parent - and the child) */ - fflush(stdout); - fflush(stderr); - - if (pipe(err_pipe) < 0) { - perror("pipe"); - _exit(-1); - } - - switch (pid = fork()) { - case -1: /* forking error */ - perror("fork"); - close(err_pipe[0]); - close(err_pipe[1]); - return; - case 0: /* child */ - { - char *tmp_browser = xstrdup(browser); - - close(err_pipe[0]); /* no reading from stderr */ - - /* make stderr of child go to err_pipe[1] */ - if (dup2(err_pipe[1], STDERR_FILENO) != STDERR_FILENO) { - perror("dup2 for stderr"); - _exit(EXIT_FAILURE); - return; /* make compiler happy */ - } - - /* - BROWSER is a colon-separated list of commands, in decreasing preference; - use the first that can be forked successfully. Note that the return - value of the command isn't used at all (with GUI programs, xdvi shouldn't - hang until they terminate!) - */ - while (tmp_browser != NULL) { - char *next = strchr(tmp_browser, ':'); - if (next != NULL) { - *next++ = '\0'; - } - TRACE_HTEX((stderr, "trying browser |%s|", tmp_browser)); - /* fork a second time to start the browser */ - if (fork_browser(tmp_browser, filename)) { /* foking worked */ - _exit(EXIT_SUCCESS); - } - tmp_browser = next; - } - /* child arrives here only if none of the commands worked */ - XDVI_WARNING((stderr, "None of the browser commands in the `browser' resource (%s) worked\n", - browser)); - free(tmp_browser); - _exit(EXIT_FAILURE); - } - default: /* parent */ - close(err_pipe[1]); /* no writing to stderr */ - - my_io->next = NULL; - my_io->fd = err_pipe[0]; - my_io->xio_events = XIO_IN; -#if HAVE_POLL - my_io->pfd = NULL; -#endif - my_io->read_proc = read_child_error; - my_io->write_proc = NULL; - my_io->data = NULL; - - my_child->next = NULL; - my_child->pid = pid; - my_child->name = NULL; - my_child->proc = handle_child_exit; - my_child->data = NULL; - my_child->io = my_io; - - set_chld(my_child); - statusline_info(STATUS_MEDIUM, "Trying to launch browser ... done."); - } -} - - |