static void remmina_plugin_rdpset_table_load_layout (RemminaPluginRdpsetTable *table) { rdpKeyboardLayout *layouts; gint i; gchar *s; GtkTreeIter iter; gtk_list_store_append (table->keyboard_layout_store, &iter); gtk_list_store_set (table->keyboard_layout_store, &iter, 0, 0, 1, _("<Auto detect>"), -1); if (rdp_keyboard_layout == 0) { gtk_combo_box_set_active (GTK_COMBO_BOX (table->keyboard_layout_combo), 0); } gtk_label_set_text (GTK_LABEL (table->keyboard_layout_label), "-"); layouts = freerdp_kbd_get_layouts ( RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_VARIANT); for (i = 0; layouts[i].code; i++) { s = g_strdup_printf ("%08X - %s", layouts[i].code, layouts[i].name); gtk_list_store_append (table->keyboard_layout_store, &iter); gtk_list_store_set (table->keyboard_layout_store, &iter, 0, layouts[i].code, 1, s, -1); if (rdp_keyboard_layout == layouts[i].code) { gtk_combo_box_set_active (GTK_COMBO_BOX (table->keyboard_layout_combo), i + 1); } if (keyboard_layout == layouts[i].code) { gtk_label_set_text (GTK_LABEL (table->keyboard_layout_label), s); } g_free (s); } free (layouts); }
/* Returns "true" on errors or other reasons to not continue normal operation */ static int process_params(xfInfo * xfi, int argc, char ** argv, int * pindex) { rdpSet * settings; rdpKeyboardLayout * layouts; char * p; RD_PLUGIN_DATA plugin_data[MAX_PLUGIN_DATA + 1]; int index; int i, j; struct passwd * pw; int num_extensions; int rv; set_default_params(xfi); settings = xfi->settings; num_extensions = 0; p = getlogin(); i = sizeof(settings->username) - 1; if (p != 0) { strncpy(settings->username, p, i); } else { pw = getpwuid(getuid()); if (pw != 0) { if (pw->pw_name != 0) { strncpy(settings->username, pw->pw_name, i); } } } if (argc < *pindex + 1) { if (*pindex == 1) printf("no parameters specified\n"); return 1; } while (*pindex < argc) { if (strcmp("-a", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing server depth\n"); exit(XF_EXIT_WRONG_PARAM); } settings->server_depth = atoi(argv[*pindex]); } else if (strcmp("-u", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing username\n"); exit(XF_EXIT_WRONG_PARAM); } strncpy(settings->username, argv[*pindex], sizeof(settings->username) - 1); settings->username[sizeof(settings->username) - 1] = 0; } else if (strcmp("-p", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing password\n"); exit(XF_EXIT_WRONG_PARAM); } strncpy(settings->password, argv[*pindex], sizeof(settings->password) - 1); settings->password[sizeof(settings->password) - 1] = 0; settings->autologin = 1; /* * Overwrite original password which could be revealed by a simple "ps aux" command. * This approach won't hide the password length, but it is better than nothing. */ memset(argv[*pindex], '*', strlen(argv[*pindex])); } else if (strcmp("-d", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing domain\n"); exit(XF_EXIT_WRONG_PARAM); } strncpy(settings->domain, argv[*pindex], sizeof(settings->domain) - 1); settings->domain[sizeof(settings->domain) - 1] = 0; } else if (strcmp("-k", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing keyboard layout ID\n"); exit(XF_EXIT_WRONG_PARAM); } sscanf(argv[*pindex], "%X", &(xfi->keyboard_layout_id)); DEBUG_X11("keyboard layout ID: %X", xfi->keyboard_layout_id); } else if (strcmp("-K", argv[*pindex]) == 0) { xfi->grab_keyboard = 0; } else if (strcmp("--kbd-list", argv[*pindex]) == 0) { layouts = freerdp_kbd_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD); printf("\nKeyboard Layouts\n"); for (i = 0; layouts[i].code; i++) printf("0x%08X\t%s\n", layouts[i].code, layouts[i].name); free(layouts); layouts = freerdp_kbd_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_VARIANT); printf("\nKeyboard Layout Variants\n"); for (i = 0; layouts[i].code; i++) printf("0x%08X\t%s\n", layouts[i].code, layouts[i].name); free(layouts); layouts = freerdp_kbd_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_IME); printf("\nKeyboard Input Method Editors (IMEs)\n"); for (i = 0; layouts[i].code; i++) printf("0x%08X\t%s\n", layouts[i].code, layouts[i].name); free(layouts); return 1; } else if (strcmp("-s", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing shell\n"); exit(XF_EXIT_WRONG_PARAM); } strncpy(settings->shell, argv[*pindex], sizeof(settings->shell) - 1); settings->shell[sizeof(settings->shell) - 1] = 0; } else if (strcmp("-c", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing directory\n"); exit(XF_EXIT_WRONG_PARAM); } strncpy(settings->directory, argv[*pindex], sizeof(settings->directory) - 1); settings->directory[sizeof(settings->directory) - 1] = 0; } else if (strcmp("-g", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing width\n"); exit(XF_EXIT_WRONG_PARAM); } settings->width = strtol(argv[*pindex], &p, 10); if (*p == 'x') { settings->height = strtol(p + 1, &p, 10); } if (*p == '%') { xfi->percentscreen = settings->width; } } else if (strcmp("-t", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing port number\n"); exit(XF_EXIT_WRONG_PARAM); } settings->tcp_port_rdp = atoi(argv[*pindex]); } else if (strcmp("-T", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing window title\n"); exit(XF_EXIT_WRONG_PARAM); } strncpy(xfi->window_title, argv[*pindex], sizeof(xfi->window_title) - 1); xfi->window_title[sizeof(xfi->window_title) - 1] = 0; } else if (strcmp("-n", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing hostname\n"); exit(XF_EXIT_WRONG_PARAM); } strncpy(settings->hostname, argv[*pindex], sizeof(settings->hostname) - 1); settings->hostname[sizeof(settings->hostname) - 1] = 0; } else if (strcmp("-o", argv[*pindex]) == 0) { settings->console_audio = 1; } else if (strcmp("-0", argv[*pindex]) == 0) { settings->console_session = 1; } else if (strcmp("-z", argv[*pindex]) == 0) { settings->bulk_compression = 1; } else if (strcmp("--gdi", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing GDI rendering\n"); return 1; } if (strncmp("sw", argv[*pindex], 1) == 0) /* Software */ { settings->software_gdi = 1; } else if (strncmp("hw", argv[*pindex], 1) == 0) /* Hardware */ { settings->software_gdi = 0; } else { printf("unknown GDI rendering\n"); return 1; } } else if (strcmp("--no-osb", argv[*pindex]) == 0) { settings->off_screen_bitmaps = 0; } else if (strcmp("--rfx", argv[*pindex]) == 0) { settings->rfx_flags = 1; settings->ui_decode_flags = 1; settings->use_frame_ack = 0; settings->server_depth = 32; settings->performanceflags = PERF_FLAG_NONE; xfi->codec = XF_CODEC_REMOTEFX; } else if (strcmp("--app", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing application name\n"); exit(XF_EXIT_WRONG_PARAM); } strncpy(settings->app_name, argv[*pindex], sizeof(settings->app_name) - 1); settings->app_name[sizeof(settings->app_name) - 1] = 0; settings->remote_app = 1; } #ifdef HAVE_XV else if (strcmp("--xv-port", argv[*pindex]) == 0) { *pindex = *pindex + 1; xfi->xv_port = atoi(argv[*pindex]); } #endif else if (strcmp("-f", argv[*pindex]) == 0) { xfi->fullscreen = xfi->fs_toggle = 1; printf("full screen option\n"); } else if (strcmp("-D", argv[*pindex]) == 0) { xfi->decoration = 0; } else if (strcmp("-x", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing performance flag\n"); exit(XF_EXIT_WRONG_PARAM); } if (strncmp("m", argv[*pindex], 1) == 0) /* modem */ { settings->performanceflags = PERF_DISABLE_WALLPAPER | PERF_DISABLE_FULLWINDOWDRAG | PERF_DISABLE_MENUANIMATIONS | PERF_DISABLE_THEMING; } else if (strncmp("b", argv[*pindex], 1) == 0) /* broadband */ { settings->performanceflags = PERF_DISABLE_WALLPAPER; } else if (strncmp("l", argv[*pindex], 1) == 0) /* lan */ { settings->performanceflags = PERF_FLAG_NONE; } else { settings->performanceflags = strtol(argv[*pindex], 0, 16); } } else if (strcmp("-X", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing XID\n"); exit(XF_EXIT_WRONG_PARAM); } xfi->embed = strtoul(argv[*pindex], NULL, 16); if (!xfi->embed) { printf("bad XID\n"); exit(XF_EXIT_WRONG_PARAM); } } #ifndef DISABLE_TLS else if (strcmp("--no-rdp", argv[*pindex]) == 0) { settings->rdp_security = 0; } else if (strcmp("--no-tls", argv[*pindex]) == 0) { settings->tls_security = 0; } else if (strcmp("--no-nla", argv[*pindex]) == 0) { settings->nla_security = 0; } else if (strcmp("--sec", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing protocol security\n"); exit(XF_EXIT_WRONG_PARAM); } if (strncmp("rdp", argv[*pindex], 1) == 0) /* Standard RDP */ { settings->rdp_security = 1; settings->tls_security = 0; settings->nla_security = 0; } else if (strncmp("tls", argv[*pindex], 1) == 0) /* TLS */ { settings->rdp_security = 0; settings->tls_security = 1; settings->nla_security = 0; } else if (strncmp("nla", argv[*pindex], 1) == 0) /* NLA */ { settings->rdp_security = 0; settings->tls_security = 0; settings->nla_security = 1; } else { printf("unknown protocol security\n"); exit(XF_EXIT_WRONG_PARAM); } } #endif else if (strcmp("--plugin", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing plugin name\n"); exit(XF_EXIT_WRONG_PARAM); } index = *pindex; memset(plugin_data, 0, sizeof(plugin_data)); if (*pindex < argc - 1 && strcmp("--data", argv[*pindex + 1]) == 0) { *pindex = *pindex + 2; i = 0; while (*pindex < argc && strcmp("--", argv[*pindex]) != 0 && i < MAX_PLUGIN_DATA) { plugin_data[i].size = sizeof(RD_PLUGIN_DATA); for (j = 0, p = argv[*pindex]; j < 4 && p != NULL; j++) { plugin_data[i].data[j] = p; if (j < 3) { p = strchr(plugin_data[i].data[j], ':'); if (p != NULL) *p++ = 0; } } *pindex = *pindex + 1; i++; } } rv = freerdp_chanman_load_plugin(xfi->chan_man, settings, argv[index], plugin_data); if (rv) exit(XF_EXIT_WRONG_PARAM); } else if (strcmp("--ext", argv[*pindex]) == 0) { *pindex = *pindex + 1; if (*pindex == argc) { printf("missing extension name\n"); exit(XF_EXIT_WRONG_PARAM); } if (num_extensions >= sizeof(settings->extensions) / sizeof(struct rdp_ext_set)) { printf("maximum extensions reached\n"); exit(XF_EXIT_WRONG_PARAM); } index = *pindex; snprintf(settings->extensions[num_extensions].name, sizeof(settings->extensions[num_extensions].name), "%s", argv[index]); settings->extensions[num_extensions].data = NULL; if (*pindex < argc - 1 && strcmp("--data", argv[*pindex + 1]) == 0) { *pindex = *pindex + 2; settings->extensions[num_extensions].data = argv[*pindex]; i = 0; while (*pindex < argc && strcmp("--", argv[*pindex]) != 0) { *pindex = *pindex + 1; i++; } } num_extensions++; } else if ((strcmp("-h", argv[*pindex]) == 0) || strcmp("--help", argv[*pindex]) == 0) { out_args(); return 1; } else if (strcmp("--version", argv[*pindex]) == 0) { printf("This is FreeRDP version %s\n", PACKAGE_VERSION); return 1; } else if (argv[*pindex][0] != '-') { settings->server[sizeof(settings->server) - 1] = 0; if (argv[*pindex][0] == '[' && (p = strchr(argv[*pindex], ']')) && (p[1] == 0 || (p[1] == ':' && !strchr(p + 2, ':')))) { /* Either "[...]" or "[...]:..." with at most one : after the brackets */ strncpy(settings->server, argv[*pindex] + 1, sizeof(settings->server) - 1); if ((p = strchr(settings->server, ']'))) { *p = 0; if (p[1] == ':') settings->tcp_port_rdp = atoi(p + 2); } } else { /* Port number is cut off and used if exactly one : in the string */ strncpy(settings->server, argv[*pindex], sizeof(settings->server) - 1); if ((p = strchr(settings->server, ':')) && !strchr(p + 1, ':')) { *p = 0; settings->tcp_port_rdp = atoi(p + 1); } } /* server is the last argument for the current session. arguments followed will be parsed for the next session. */ *pindex = *pindex + 1; return 0; } else { printf("invalid option: %s\n", argv[*pindex]); exit(XF_EXIT_WRONG_PARAM); } *pindex = *pindex + 1; } printf("missing server name\n"); exit(XF_EXIT_WRONG_PARAM); }