void start_server(int f_in, int f_out, int argc, char *argv[]) { set_nonblocking(f_in); set_nonblocking(f_out); io_set_sock_fds(f_in, f_out); setup_protocol(f_out, f_in); if (protocol_version >= 23) io_start_multiplex_out(); if (am_sender) { keep_dirlinks = 0; /* Must be disabled on the sender. */ if (need_messages_from_generator) io_start_multiplex_in(); recv_filter_list(f_in); do_server_sender(f_in, f_out, argc, argv); } else { do_server_recv(f_in, f_out, argc, argv); } exit_cleanup(0); }
/** * vinagre_connect: * @window: A Window * * Return value: (allow-none) (transfer full): */ VinagreConnection * vinagre_connect (VinagreWindow *window) { VinagreConnection *conn = NULL; gint result; VinagreConnectDialog dialog; dialog.xml = vinagre_utils_get_builder (); if (!dialog.xml) return NULL; dialog.dialog = GTK_WIDGET (gtk_builder_get_object (dialog.xml, "connect_dialog")); gtk_window_set_transient_for (GTK_WINDOW (dialog.dialog), GTK_WINDOW (window)); dialog.protocol_combo = GTK_WIDGET (gtk_builder_get_object (dialog.xml, "protocol_combo")); dialog.protocol_description_label = GTK_WIDGET (gtk_builder_get_object (dialog.xml, "protocol_description_label")); dialog.host_entry = GTK_WIDGET (gtk_builder_get_object (dialog.xml, "host_entry")); dialog.find_button = GTK_WIDGET (gtk_builder_get_object (dialog.xml, "find_button")); dialog.fullscreen_check = GTK_WIDGET (gtk_builder_get_object (dialog.xml, "fullscreen_check")); dialog.plugin_box = GTK_WIDGET (gtk_builder_get_object (dialog.xml, "plugin_options_connect_vbox")); dialog.connect_button = GTK_WIDGET (gtk_builder_get_object (dialog.xml, "connect_button")); setup_protocol (&dialog); setup_combo (&dialog); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog.fullscreen_check), vinagre_cache_prefs_get_boolean ("connection", "fullscreen", FALSE)); #ifdef VINAGRE_HAVE_AVAHI g_signal_connect (dialog.find_button, "clicked", G_CALLBACK (vinagre_connect_find_button_cb), &dialog); #else gtk_widget_hide (dialog.find_button); gtk_widget_set_no_show_all (dialog.find_button, TRUE); #endif gtk_widget_show_all (dialog.dialog); result = gtk_dialog_run (GTK_DIALOG (dialog.dialog)); if (result == GTK_RESPONSE_HELP) { vinagre_utils_show_help (GTK_WINDOW (window), "connect"); } else if (result == GTK_RESPONSE_OK) { gchar *host = NULL, *error_msg = NULL, *protocol = NULL, *actual_host; gint port; GtkWidget *options; GtkTreeIter iter; VinagreProtocol *ext; host = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (dialog.host_entry)); gtk_widget_hide (GTK_WIDGET (dialog.dialog)); if (!host || !g_strcmp0 (host, "")) goto fail; save_history (dialog.host_entry); if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (dialog.protocol_combo), &iter)) { g_warning (_("Could not get the active protocol from the protocol list.")); goto fail; } gtk_tree_model_get (GTK_TREE_MODEL (dialog.protocol_store), &iter, PROTOCOL_NAME, &protocol, PROTOCOL_OPTIONS, &options, PROTOCOL_PLUGIN, &ext, -1); vinagre_cache_prefs_set_string ("connection", "last-protocol", protocol); g_free (protocol); vinagre_cache_prefs_set_boolean ("connection", "fullscreen", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog.fullscreen_check))); conn = vinagre_protocol_new_connection (ext); if (vinagre_connection_split_string (host, vinagre_connection_get_protocol (conn), &protocol, &actual_host, &port, &error_msg)) { g_object_set (conn, "host", actual_host, "port", port, "fullscreen", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog.fullscreen_check)), NULL); if (options) vinagre_connection_parse_options_widget (conn, options); g_free (protocol); g_free (actual_host); } else { vinagre_utils_show_error_dialog (NULL, error_msg ? error_msg : _("Unknown error"), GTK_WINDOW (window)); } g_object_unref (ext); if (options) g_object_unref (options); fail: g_free (host); g_free (error_msg); } gtk_widget_destroy (dialog.dialog); g_object_unref (dialog.xml); return conn; }
/* * This is called once the connection has been negotiated. It is used * for rsyncd, remote-shell, and local connections. */ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[]) { struct file_list *flist = NULL; int status = 0, status2 = 0; char *local_name = NULL; cleanup_child_pid = pid; if (!read_batch) { set_nonblocking(f_in); set_nonblocking(f_out); } io_set_sock_fds(f_in, f_out); setup_protocol(f_out,f_in); if (protocol_version >= 23 && !read_batch) io_start_multiplex_in(); /* We set our stderr file handle to blocking because ssh might have * set it to non-blocking. This can be particularly troublesome if * stderr is a clone of stdout, because ssh would have set our stdout * to non-blocking at the same time (which can easily cause us to lose * output from our print statements). This kluge shouldn't cause ssh * any problems for how we use it. Note also that we delayed setting * this until after the above protocol setup so that we know for sure * that ssh is done twiddling its file descriptors. */ set_blocking(STDERR_FILENO); if (am_sender) { keep_dirlinks = 0; /* Must be disabled on the sender. */ io_start_buffering_out(); if (!filesfrom_host) set_msg_fd_in(f_in); send_filter_list(f_out); if (filesfrom_host) filesfrom_fd = f_in; if (write_batch && !am_server) start_write_batch(f_out); flist = send_file_list(f_out, argc, argv); set_msg_fd_in(-1); if (verbose > 3) rprintf(FINFO,"file list sent\n"); the_file_list = flist; io_flush(NORMAL_FLUSH); send_files(flist,f_out,f_in); io_flush(FULL_FLUSH); handle_stats(-1); if (protocol_version >= 24) read_final_goodbye(f_in, f_out); if (pid != -1) { if (verbose > 3) rprintf(FINFO,"client_run waiting on %d\n", (int) pid); io_flush(FULL_FLUSH); wait_process(pid, &status); } output_summary(); io_flush(FULL_FLUSH); exit_cleanup(status); } if (need_messages_from_generator && !read_batch) io_start_multiplex_out(); if (argc == 0) list_only |= 1; send_filter_list(read_batch ? -1 : f_out); if (filesfrom_fd >= 0) { io_set_filesfrom_fds(filesfrom_fd, f_out); filesfrom_fd = -1; } if (write_batch && !am_server) start_write_batch(f_in); flist = recv_file_list(f_in); the_file_list = flist; if (flist && flist->count > 0) { local_name = get_local_name(flist, argv[0]); status2 = do_recv(f_in, f_out, flist, local_name); } else { handle_stats(-1); output_summary(); } if (pid != -1) { if (verbose > 3) rprintf(FINFO,"client_run2 waiting on %d\n", (int) pid); io_flush(FULL_FLUSH); wait_process(pid, &status); } return MAX(status, status2); }