+ return 1;
+err_out:
+ close(pcd->fd);
+ pcd->fd = -1;
+ return ret;
+}
+
+/**
+ * Open connection to para_server.
+ *
+ * \param argc Usual argument count.
+ * \param argv Usual argument vector.
+ * \param pcd_ptr Points to dynamically allocated and initialized private client data
+ * upon successful return.
+ *
+ * Check the command line options given by \a argc and argv, set default values
+ * for user name and rsa key file, read further option from the config file.
+ * Finally, establish a connection to para_server.
+ *
+ * \return Standard.
+ */
+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);
+ HANDLE_VERSION_FLAG("client", 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) {
+ struct client_cmdline_parser_params params = {
+ .override = 0,
+ .initialize = 0,
+ .check_required = 0,
+ .check_ambiguity = 0
+ };
+ client_cmdline_parser_config_file(pcd->config_file,
+ &pcd->conf, ¶ms);
+ }