X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-ui%2Fbssh.c;h=491380f600f88fb87ff14572d3dd07b7496f99b8;hb=78061979a21cf3b6f3266b1dc2f3d310d893d99f;hp=d5bec128b79460b3ff18185998fd9bf677723005;hpb=bb8bd5490a71bc77570653cf53be88edd37679e3;p=catta diff --git a/avahi-ui/bssh.c b/avahi-ui/bssh.c index d5bec12..491380f 100644 --- a/avahi-ui/bssh.c +++ b/avahi-ui/bssh.c @@ -1,5 +1,3 @@ -/* $Id$ */ - /*** This file is part of avahi. @@ -27,6 +25,8 @@ #include #include #include +#include +#include #include @@ -38,26 +38,132 @@ #include "avahi-ui.h" +typedef enum { + COMMAND_HELP, + COMMAND_SSH, + COMMAND_VNC, + COMMAND_SHELL +} Command; + +typedef struct Config { + char *domain; + Command command; +} Config; + +static void help(FILE *f, const char *argv0) { + fprintf(f, + _("%s [options]\n\n" + " -h --help Show this help\n" + " -s --ssh Browse SSH servers\n" + " -v --vnc Browse VNC servers\n" + " -S --shell Browse both SSH and VNC\n" + " -d --domain=DOMAIN The domain to browse in\n"), + argv0); +} + +static int parse_command_line(Config *c, int argc, char *argv[]) { + int o; + + static const struct option long_options[] = { + { "help", no_argument, NULL, 'h' }, + { "ssh", no_argument, NULL, 's' }, + { "vnc", no_argument, NULL, 'v' }, + { "shell", no_argument, NULL, 'S' }, + { "domain", required_argument, NULL, 'd' }, + { NULL, 0, NULL, 0 } + }; + + while ((o = getopt_long(argc, argv, "hVd:svS", long_options, NULL)) >= 0) { + + switch(o) { + case 'h': + c->command = COMMAND_HELP; + break; + case 's': + c->command = COMMAND_SSH; + break; + case 'v': + c->command = COMMAND_VNC; + break; + case 'S': + c->command = COMMAND_SHELL; + break; + case 'd': + avahi_free(c->domain); + c->domain = avahi_strdup(optarg); + break; + default: + return -1; + } + } + + if (optind < argc) { + fprintf(stderr, _("Too many arguments\n")); + return -1; + } + + return 0; +} + int main(int argc, char*argv[]) { GtkWidget *d; + Config config; + const char *argv0; avahi_init_i18n(); + setlocale(LC_ALL, ""); + + if ((argv0 = strrchr(argv[0], '/'))) + argv0++; + else + argv0 = argv[0]; + + if (g_str_has_suffix(argv[0], "bshell")) + config.command = COMMAND_SHELL; + else if (g_str_has_suffix(argv[0], "bvnc")) + config.command = COMMAND_VNC; + else + config.command = COMMAND_SSH; + + /* defaults to local */ + config.domain = NULL; + + if (parse_command_line(&config, argc, argv) < 0) { + help(stderr, argv0); + return 1; + } + + bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); gtk_init(&argc, &argv); - if (g_str_has_suffix(argv[0], "bshell")) { - d = aui_service_dialog_new(_("Choose Shell Server"), NULL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_CONNECT, GTK_RESPONSE_ACCEPT, NULL); - aui_service_dialog_set_browse_service_types(AUI_SERVICE_DIALOG(d), "_rfb._tcp", "_ssh._tcp", NULL); - aui_service_dialog_set_service_type_name(AUI_SERVICE_DIALOG(d), "_rfb._tcp", _("Desktop")); - aui_service_dialog_set_service_type_name(AUI_SERVICE_DIALOG(d), "_ssh._tcp", _("Terminal")); - } else if (g_str_has_suffix(argv[0], "bvnc")) { - d = aui_service_dialog_new(_("Choose VNC server"), NULL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_CONNECT, GTK_RESPONSE_ACCEPT, NULL); - aui_service_dialog_set_browse_service_types(AUI_SERVICE_DIALOG(d), "_rfb._tcp", NULL); - } else { - d = aui_service_dialog_new(_("Choose SSH server"), NULL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_CONNECT, GTK_RESPONSE_ACCEPT, NULL); - aui_service_dialog_set_browse_service_types(AUI_SERVICE_DIALOG(d), "_ssh._tcp", NULL); + switch (config.command) { + case COMMAND_HELP: + help(stdout, argv0); + return 0; + break; + + case COMMAND_SHELL: + d = aui_service_dialog_new(_("Choose Shell Server"), NULL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_CONNECT, GTK_RESPONSE_ACCEPT, NULL); + aui_service_dialog_set_browse_service_types(AUI_SERVICE_DIALOG(d), "_rfb._tcp", "_ssh._tcp", NULL); + aui_service_dialog_set_service_type_name(AUI_SERVICE_DIALOG(d), "_rfb._tcp", _("Desktop")); + aui_service_dialog_set_service_type_name(AUI_SERVICE_DIALOG(d), "_ssh._tcp", _("Terminal")); + break; + + case COMMAND_VNC: + d = aui_service_dialog_new(_("Choose VNC server"), NULL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_CONNECT, GTK_RESPONSE_ACCEPT, NULL); + aui_service_dialog_set_browse_service_types(AUI_SERVICE_DIALOG(d), "_rfb._tcp", NULL); + break; + + case COMMAND_SSH: + d = aui_service_dialog_new(_("Choose SSH server"), NULL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_CONNECT, GTK_RESPONSE_ACCEPT, NULL); + aui_service_dialog_set_browse_service_types(AUI_SERVICE_DIALOG(d), "_ssh._tcp", NULL); + break; } + aui_service_dialog_set_domain (AUI_SERVICE_DIALOG(d), config.domain); aui_service_dialog_set_resolve_service(AUI_SERVICE_DIALOG(d), TRUE); aui_service_dialog_set_resolve_host_name(AUI_SERVICE_DIALOG(d), !avahi_nss_support()); @@ -84,8 +190,9 @@ int main(int argc, char*argv[]) { gtk_widget_destroy(d); - g_print("xvncviewer %s\n", p); + g_print("vncviewer %s\n", p); execlp("xvncviewer", "xvncviewer", p, NULL); + execlp("vncviewer", "vncviewer", p, NULL); } else { char p[16]; @@ -143,5 +250,7 @@ int main(int argc, char*argv[]) { g_print(_("Canceled.\n")); } + g_free(config.domain); + return 1; }