-static int client_connect(struct private_client_data *pcd)
-{
- int ret;
- struct hostent *he;
- struct sockaddr_in their_addr;
-
- pcd->fd = -1;
- ret = get_host_info(pcd->conf.hostname_arg, &he);
- if (ret < 0)
- return ret;
- /* get new socket */
- ret = get_socket();
- if (ret < 0)
- return ret;
- pcd->fd = ret;
- /* init their_addr */
- init_sockaddr(&their_addr, pcd->conf.server_port_arg, he);
- ret = para_connect(pcd->fd, &their_addr);
- if (ret < 0)
- goto err_out;
- pcd->status = CL_CONNECTED;
- ret = mark_fd_nonblock(pcd->fd);
- if (ret < 0)
- goto err_out;
- pcd->task.pre_select = client_pre_select;
- pcd->task.post_select = client_post_select;
- pcd->task.private_data = pcd;
- sprintf(pcd->task.status, "client");
- register_task(&pcd->task);
- return 1;
-err_out:
- close(pcd->fd);
- pcd->fd = -1;
- return ret;
-}
-
-int client_open(int argc, char *argv[], struct private_client_data **pcd_ptr)
-{
- char *home = para_homedir();
- struct stat statbuf;
- int ret;
- struct private_client_data *pcd =
- para_calloc(sizeof(struct private_client_data));
-
- *pcd_ptr = pcd;
- pcd->fd = -1;
- ret = client_cmdline_parser(argc, argv, &pcd->conf);
- ret = -E_CLIENT_SYNTAX;
- if (!pcd->conf.inputs_num)
- goto out;
- pcd->user = pcd->conf.user_given?
- para_strdup(pcd->conf.user_arg) : para_logname();
-
- pcd->key_file = pcd->conf.key_file_given?
- para_strdup(pcd->conf.key_file_arg) :
- make_message("%s/.paraslash/key.%s", home, pcd->user);
-
- pcd->config_file = pcd->conf.config_file_given?
- para_strdup(pcd->conf.config_file_arg) :
- make_message("%s/.paraslash/client.conf", home);
- ret = stat(pcd->config_file, &statbuf);
- if (ret && pcd->conf.config_file_given) {
- ret = -E_NO_CONFIG;
- goto out;
- }
- if (!ret)
- client_cmdline_parser_configfile(pcd->config_file,
- &pcd->conf, 0, 0, 0);
- ret = 1;
- PARA_INFO_LOG("loglevel: %d\n", pcd->conf.loglevel_arg);
- PARA_INFO_LOG("config_file: %s\n", pcd->config_file);
- PARA_INFO_LOG("key_file: %s\n", pcd->key_file);
- PARA_NOTICE_LOG("connecting %s:%d\n", pcd->conf.hostname_arg,
- pcd->conf.server_port_arg);
- ret = client_connect(pcd);
-out:
- free(home);
- if (ret < 0) {
- PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret));
- client_close(pcd);
- }
- return ret;
-}
-
-void client_pre_select(struct sched *s, struct task *t)
+/**
+ * The preselect hook for server commands.
+ *
+ * \param s Pointer to the scheduler.
+ * \param t Pointer to the task struct for this command.
+ *
+ * The task pointer must contain a pointer to the initialized client data
+ * structure as it is returned by client_open().
+ *
+ * This function checks the state of the connection and adds the file descriptor
+ * of the connection to the read or write fd set of \a s accordingly.
+ *
+ * \sa register_task() client_open(), struct sched, struct task.
+ */
+static void client_pre_select(struct sched *s, struct task *t)