Merge branch 'master' into my-osx
[paraslash.git] / client_common.c
index 330c9f7..c738079 100644 (file)
@@ -27,6 +27,7 @@
 #include "net.h"
 #include "fd.h"
 #include "string.h"
+#include "client.cmdline.h"
 #include "client.h"
 #include "error.h"
 
@@ -49,8 +50,10 @@ void client_close(struct private_client_data *pcd)
 {
        if (pcd)
                return;
-       if (pcd->fd >= 0)
+       if (pcd->fd >= 0) {
+               disable_crypt(pcd->fd);
                close(pcd->fd);
+       }
        free(pcd->user);
        free(pcd->config_file);
        free(pcd->key_file);
@@ -67,7 +70,7 @@ int client_parse_config(int argc, char *argv[],
                para_calloc(sizeof(struct private_client_data));
 
        pcd->fd = -1;
-       cmdline_parser(argc, argv, &pcd->conf);
+       client_cmdline_parser(argc, argv, &pcd->conf);
        ret = - E_CLIENT_SYNTAX;
        if (!pcd->conf.inputs_num)
                goto out;
@@ -87,19 +90,15 @@ int client_parse_config(int argc, char *argv[],
                goto out;
        }
        if (!ret)
-               cmdline_parser_configfile(pcd->config_file, &pcd->conf, 0, 0, 0);
+               client_cmdline_parser_configfile(pcd->config_file,
+                       &pcd->conf, 0, 0, 0);
        ret = 1;
        *pcd_ptr = pcd;
-       PARA_INFO_LOG(
-               "current loglevel: %d\n"
-               "using config_file: %s\n"
-               "using key_file: %s\n"
-               "connecting to %s:%d\n" ,
-               pcd->conf.loglevel_arg,
-               pcd->config_file,
-               pcd->key_file,
-               pcd->conf.hostname_arg, pcd->conf.server_port_arg
-       );
+       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);
 out:
        free(home);
        if (ret < 0)
@@ -111,7 +110,6 @@ void client_pre_select(struct sched *s, struct task *t)
 {
        struct private_client_data *pcd = t->private_data;
 
-       PARA_INFO_LOG("status %d\n", pcd->status);
        t->ret = 1;
        pcd->check_r = 0;
        pcd->check_w = 0;
@@ -133,13 +131,13 @@ void client_pre_select(struct sched *s, struct task *t)
                pcd->check_w = 1;
                return;
 
-       case CL_RECEIVING_SERVER_OUTPUT:
+       case CL_RECEIVING:
                if (pcd->loaded < CLIENT_BUFSIZE - 1) {
                        para_fd_set(pcd->fd, &s->rfds, &s->max_fileno);
                        pcd->check_r = 1;
                }
                return;
-       case CL_SENDING_STDIN:
+       case CL_SENDING:
                if (*pcd->in_loaded) {
                        PARA_INFO_LOG("loaded: %zd\n", *pcd->in_loaded);
                        para_fd_set(pcd->fd, &s->wfds, &s->max_fileno);
@@ -171,7 +169,7 @@ void client_post_select(struct sched *s, struct task *t)
 {
        struct private_client_data *pcd = t->private_data;
 
-       PARA_INFO_LOG("status %d\n", pcd->status);
+//     PARA_INFO_LOG("status %d\n", pcd->status);
        t->ret = 1;
        if (pcd->fd < 0)
                return;
@@ -228,7 +226,7 @@ void client_post_select(struct sched *s, struct task *t)
                if (t->ret < 0)
                        return;
                bytes_received = t->ret;
-               PARA_INFO_LOG("++++ server info ++++\n%s\n++++ end of server "
+               PARA_DEBUG_LOG("++++ server info ++++\n%s\n++++ end of server "
                        "info ++++\n", pcd->buf);
                /* check if server has sent "Proceed" message */
                t->ret = -E_CLIENT_AUTH;
@@ -259,7 +257,7 @@ void client_post_select(struct sched *s, struct task *t)
                        free(tmp);
                }
                command = para_strcat(command, EOC_MSG "\n");
-               PARA_INFO_LOG("--> %s\n", command);
+               PARA_DEBUG_LOG("--> %s\n", command);
                t->ret = send_buffer(pcd->fd, command);
                free(command);
                if (t->ret > 0)
@@ -273,21 +271,18 @@ void client_post_select(struct sched *s, struct task *t)
                        return;
                t->ret = -E_HANDSHAKE_COMPLETE;
                if (strstr(pcd->buf, AWAITING_DATA_MSG))
-                       pcd->status = CL_SENDING_STDIN;
+                       pcd->status = CL_SENDING;
                else
-                       pcd->status = CL_RECEIVING_SERVER_OUTPUT;
+                       pcd->status = CL_RECEIVING;
                return;
-       case CL_SENDING_STDIN: /* FIXME: might block */
+       case CL_SENDING: /* FIXME: might block */
                PARA_INFO_LOG("loaded: %zd\n", *pcd->in_loaded);
                t->ret = send_bin_buffer(pcd->fd, pcd->inbuf, *pcd->in_loaded);
-               if (t->ret <= 0) {
-                       if (!t->ret)
-                               t->ret = 1;
+               if (t->ret < 0)
                        return;
-               }
                *pcd->in_loaded = 0; /* FIXME: short writes */
                return;
-       case CL_RECEIVING_SERVER_OUTPUT:
+       case CL_RECEIVING:
                t->ret = client_recv_buffer(pcd);
                return;
        }
@@ -300,9 +295,6 @@ int client_open(struct private_client_data *pcd)
        struct hostent *he;
        struct sockaddr_in their_addr;
 
-       /* get the host info */
-       PARA_NOTICE_LOG("getting host info of %s\n",
-               pcd->conf.hostname_arg);
        ret = get_host_info(pcd->conf.hostname_arg, &he);
        if (ret < 0)
                goto out;
@@ -313,12 +305,13 @@ int client_open(struct private_client_data *pcd)
        pcd->fd = ret;
        /* init their_addr */
        init_sockaddr(&their_addr, pcd->conf.server_port_arg, he);
-       /* connect */
-       PARA_NOTICE_LOG("connecting to %s\n", pcd->conf.hostname_arg);
        ret = para_connect(pcd->fd, &their_addr);
        if (ret < 0)
                goto out;
        pcd->status = CL_CONNECTED;
+       ret = mark_fd_nonblock(pcd->fd);
+       if (ret < 0)
+               goto out;
        pcd->task.pre_select = client_pre_select;
        pcd->task.post_select = client_post_select;
        pcd->task.private_data = pcd;