/** * Open a pipe for raw input. This is a stripped-down version of * pcap_loop.c:cap_pipe_open_live(). * We check if "pipe_name" is "-" (stdin) or a FIFO, and open it. * @param pipe_name The name of the pipe or FIFO. * @return A POSIX file descriptor on success, or -1 on failure. */ static int raw_pipe_open(const char *pipe_name) { #ifndef _WIN32 struct stat pipe_stat; #else char *pncopy, *pos; DWORD err; wchar_t *err_str; HANDLE hPipe = NULL; #endif int rfd; g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "open_raw_pipe: %s", pipe_name); /* * XXX Rawshark blocks until we return */ if (strcmp(pipe_name, "-") == 0) { rfd = 0; /* read from stdin */ #ifdef _WIN32 /* * This is needed to set the stdin pipe into binary mode, otherwise * CR/LF are mangled... */ _setmode(0, _O_BINARY); #endif /* _WIN32 */ } else { #ifndef _WIN32 if (ws_stat(pipe_name, &pipe_stat) < 0) { fprintf(stderr, "rawshark: The pipe %s could not be checked: %s\n", pipe_name, strerror(errno)); return -1; } if (! S_ISFIFO(pipe_stat.st_mode)) { if (S_ISCHR(pipe_stat.st_mode)) { /* * Assume the user specified an interface on a system where * interfaces are in /dev. Pretend we haven't seen it. */ } else { fprintf(stderr, "rawshark: \"%s\" is neither an interface nor a pipe\n", pipe_name); } return -1; } rfd = ws_open(pipe_name, O_RDONLY | O_NONBLOCK, 0000 /* no creation so don't matter */); if (rfd == -1) { fprintf(stderr, "rawshark: \"%s\" could not be opened: %s\n", pipe_name, strerror(errno)); return -1; } #else /* _WIN32 */ #define PIPE_STR "\\pipe\\" /* Under Windows, named pipes _must_ have the form * "\\<server>\pipe\<pipe_name>". <server> may be "." for localhost. */ pncopy = g_strdup(pipe_name); if (strstr(pncopy, "\\\\") == pncopy) { pos = strchr(pncopy + 3, '\\'); if (pos && g_ascii_strncasecmp(pos, PIPE_STR, strlen(PIPE_STR)) != 0) pos = NULL; } g_free(pncopy); if (!pos) { fprintf(stderr, "rawshark: \"%s\" is neither an interface nor a pipe\n", pipe_name); return -1; } /* Wait for the pipe to appear */ while (1) { hPipe = CreateFile(utf_8to16(pipe_name), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if (hPipe != INVALID_HANDLE_VALUE) break; err = GetLastError(); if (err != ERROR_PIPE_BUSY) { FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, err, 0, (LPTSTR) &err_str, 0, NULL); fprintf(stderr, "rawshark: \"%s\" could not be opened: %s (error %d)\n", pipe_name, utf_16to8(err_str), err); LocalFree(err_str); return -1; } if (!WaitNamedPipe(utf_8to16(pipe_name), 30 * 1000)) { err = GetLastError(); FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, err, 0, (LPTSTR) &err_str, 0, NULL); fprintf(stderr, "rawshark: \"%s\" could not be waited for: %s (error %d)\n", pipe_name, utf_16to8(err_str), err); LocalFree(err_str); return -1; } } rfd = _open_osfhandle((long) hPipe, _O_RDONLY); if (rfd == -1) { fprintf(stderr, "rawshark: \"%s\" could not be opened: %s\n", pipe_name, strerror(errno)); return -1; } #endif /* _WIN32 */ } return rfd; }
gboolean browser_open_url (const gchar *url) { #if defined(G_OS_WIN32) return ((intptr_t) ShellExecute (HWND_DESKTOP, _T("open"), utf_8to16(url), NULL, NULL, SW_SHOWNORMAL) > 32); #elif defined(HAVE_OS_X_FRAMEWORKS) CFStringRef url_CFString; CFURLRef url_CFURL; OSStatus status; /* * XXX - if URLs passed to "browser_open_url()" contain non-ASCII * characters, we'd have to choose an appropriate value from the * CFStringEncodings enum. */ url_CFString = CFStringCreateWithCString(NULL, url, kCFStringEncodingASCII); if (url_CFString == NULL) return (FALSE); url_CFURL = CFURLCreateWithString(NULL, url_CFString, NULL); CFRelease(url_CFString); if (url_CFURL == NULL) { /* * XXX - this could mean that the url_CFString wasn't a valid URL, * or that memory allocation failed. We can't determine which, * except perhaps by providing our own allocator and somehow * flagging allocation failures. */ return (FALSE); } /* * XXX - this is a Launch Services result code, and we should probably * display a dialog box if it's not 0, describing what the error was. * Then again, we should probably do the same for the ShellExecute call, * unless that call itself happens to pop up a dialog box for all errors. */ status = LSOpenCFURLRef(url_CFURL, NULL); CFRelease(url_CFURL); return (status == 0); #elif defined(HAVE_XDG_OPEN) GError *error = NULL; const gchar *argv[3]; gboolean retval; g_return_val_if_fail (url != NULL, FALSE); argv[0] = "xdg-open"; argv[1] = url; argv[2] = NULL; /* * XXX - use g_spawn_on_screen() so the browser window shows up on * the same screen? * * Also, g_spawn_async() shouldn't modify argv but takes it as non-const! */ retval = g_spawn_async (NULL, (gchar**) argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, &error); if (! retval) { simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, "%sCould not execute xdg-open: %s\n\n\"%s\"", simple_dialog_primary_start(), simple_dialog_primary_end(), error->message); g_error_free (error); } return retval; #elif defined(MUST_LAUNCH_BROWSER_OURSELVES) GError *error = NULL; gchar *browser; gchar *argument; gchar *cmd; gchar **argv; gboolean retval; g_return_val_if_fail (url != NULL, FALSE); /* browser = gimp_gimprc_query ("web-browser");*/ browser = g_strdup(prefs.gui_webbrowser); if (browser == NULL || ! strlen (browser)) { simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, "Web browser not specified.\n" "Please correct the web browser setting in the Preferences dialog.\n" "URL: %s", url); g_free (browser); return FALSE; } /* quote the url since it might contains special chars */ argument = g_shell_quote (url); /* replace %s with URL */ if (strstr (browser, "%s")) cmd = strreplace (browser, "%s", argument); else cmd = g_strconcat (browser, " ", argument, NULL); g_free (argument); /* parse the cmd line */ if (! g_shell_parse_argv (cmd, NULL, &argv, &error)) { simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, "%sCould not parse web browser command: \"%s\"%s\n\n\"%s\"\n\n%s", simple_dialog_primary_start(), browser, simple_dialog_primary_end(), error->message, "Please correct the web browser setting in the Preferences dialog."); g_error_free (error); return FALSE; } /* * XXX - use g_spawn_on_screen() so the browser window shows up on * the same screen? */ retval = g_spawn_async (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, &error); if (! retval) { simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, "%sCould not execute web browser: \"%s\"%s\n\n\"%s\"\n\n%s", simple_dialog_primary_start(), browser, simple_dialog_primary_end(), error->message, "Please correct the web browser setting in the Preferences dialog."); g_error_free (error); } g_free (browser); g_free (cmd); g_strfreev (argv); return retval; #endif }
/* * Given a filename return a filesystem URL. Relative paths are prefixed with * the datafile directory path. */ gchar * data_file_url(const gchar *filename) { gchar *file_path; gchar *uri; /* Absolute path? */ #ifdef G_OS_WIN32 if((strlen(filename) > 2) && (filename[1] == ':')) { file_path = g_strdup(filename); #else if((strlen(filename) > 1) && (filename[0] == '/')) { file_path = g_strdup(filename); #endif } else if(running_in_build_directory()) { file_path = g_strdup_printf("%s/doc/%s", get_datafile_dir(), filename); } else { file_path = g_strdup_printf("%s/%s", get_datafile_dir(), filename); } /* XXX - check, if the file is really existing, otherwise display a simple_dialog about the problem */ /* convert filename to uri */ uri = g_filename_to_uri(file_path, NULL, NULL); g_free(file_path); return uri; } const char * topic_online_url(topic_action_e action) { switch(action) { case(ONLINEPAGE_HOME): return "https://www.wireshark.org"; break; case(ONLINEPAGE_WIKI): return "https://wiki.wireshark.org"; break; case(ONLINEPAGE_DOWNLOAD): return "https://www.wireshark.org/download.html"; break; case(ONLINEPAGE_USERGUIDE): return "https://www.wireshark.org/docs/wsug_html_chunked/"; break; case(ONLINEPAGE_FAQ): return "http://www.wireshark.org/faq.html"; break; case(ONLINEPAGE_ASK): return "https://ask.wireshark.org"; break; case(ONLINEPAGE_SAMPLE_FILES): return "https://wiki.wireshark.org/SampleCaptures"; break; case(ONLINEPAGE_CAPTURE_SETUP): return "https://wiki.wireshark.org/CaptureSetup"; break; case(ONLINEPAGE_NETWORK_MEDIA): return "https://wiki.wireshark.org/CaptureSetup/NetworkMedia"; break; case(ONLINEPAGE_SAMPLE_CAPTURES): return "https://wiki.wireshark.org/SampleCaptures"; break; case(ONLINEPAGE_SECURITY): return "https://wiki.wireshark.org/Security"; break; case(ONLINEPAGE_CHIMNEY): return "https://wiki.wireshark.org/CaptureSetup/Offloading#chimney"; break; default: return NULL; } } /* * Open the help dialog and show a specific HTML help page. */ gchar * user_guide_url(const gchar *page) { GString *url = g_string_new(""); /* * Try to open local .chm file. This is not the most intuitive way to * go about this but it fits in with the rest of the _url functions. */ #ifdef HHC_DIR HWND hw; g_string_printf(url, "%s\\user-guide.chm::/wsug_chm/%s>Wireshark Help", get_datafile_dir(), page); hw = HtmlHelpW(NULL, utf_8to16(url->str), HH_DISPLAY_TOPIC, 0); /* if the .chm file could be opened, stop here */ if(hw != NULL) { g_string_free(url, TRUE /* free_segment */); return NULL; } #endif /* HHC_DIR */ #ifdef DOC_DIR if (g_file_test(DOC_DIR "/guides/wsug_html_chunked", G_FILE_TEST_IS_DIR)) { /* try to open the HTML page from wireshark.org instead */ g_string_printf(url, "file://" DOC_DIR "/guides/wsug_html_chunked/%s", page); } else { #endif /* ifdef DOC_DIR */ /* try to open the HTML page from wireshark.org instead */ g_string_printf(url, "https://www.wireshark.org/docs/wsug_html_chunked/%s", page); #ifdef DOC_DIR } #endif /* ifdef DOC_DIR */ return g_string_free(url, FALSE); }