X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=client_common.c;h=f4b09cd23c2eeedf7974583f3bf2cf145c993fc5;hp=a4aa6d8c3ecc3ae386cbb14515f05f8257d96e0d;hb=5ec373417adc2fc80e407e7a5bcd8329f02b314c;hpb=4ac3134c050ba28b57e0ae9686eb1f6d83e6d586 diff --git a/client_common.c b/client_common.c index a4aa6d8c..f4b09cd2 100644 --- a/client_common.c +++ b/client_common.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1997-2012 Andre Noll + * Copyright (C) 1997-2013 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -13,7 +13,6 @@ #include "error.h" #include "list.h" #include "sched.h" -#include "client.cmdline.h" #include "crypt.h" #include "net.h" #include "fd.h" @@ -28,11 +27,11 @@ #define CLIENT_BUFSIZE 4000 /** - * Close the connection to para_server and deallocate per-command ressources. + * Close the connection to para_server and deallocate per-command resources. * * \param ct The client task. * - * This frees all ressources of the current command but keeps the configuration + * This frees all resources of the current command but keeps the configuration * in \p ct->conf. * * \sa \ref client_close(). @@ -44,6 +43,7 @@ void client_disconnect(struct client_task *ct) if (ct->scc.fd >= 0) close(ct->scc.fd); free_argv(ct->features); + ct->features = NULL; sc_free(ct->scc.recv); ct->scc.recv = NULL; sc_free(ct->scc.send); @@ -325,7 +325,7 @@ static int send_sb_command(struct client_task *ct) * * \sa struct sched, struct task. */ -static void client_post_select(struct sched *s, struct task *t) +static int client_post_select(struct sched *s, struct task *t) { struct client_task *ct = container_of(t, struct client_task, task); struct btr_node *btrn = ct->btrn; @@ -333,9 +333,11 @@ static void client_post_select(struct sched *s, struct task *t) size_t n; char buf[CLIENT_BUFSIZE]; - t->error = 0; + ret = task_get_notification(t); + if (ret < 0) + goto out; if (ct->scc.fd < 0) - return; + return 0; switch (ct->status) { case CL_CONNECTED: /* receive welcome message */ ret = client_recv_buffer(ct, &s->rfds, buf, sizeof(buf), &n); @@ -343,10 +345,10 @@ static void client_post_select(struct sched *s, struct task *t) goto out; ct->features = parse_features(buf); ct->status = CL_RECEIVED_WELCOME; - return; + return 0; case CL_RECEIVED_WELCOME: /* send auth command */ if (!FD_ISSET(ct->scc.fd, &s->wfds)) - return; + return 0; if (has_feature("sideband", ct)) { ct->use_sideband = true; sprintf(buf, AUTH_REQUEST_MSG "%s sideband", ct->user); @@ -357,7 +359,7 @@ static void client_post_select(struct sched *s, struct task *t) if (ret < 0) goto out; ct->status = CL_SENT_AUTH; - return; + return 0; case CL_SENT_AUTH: /* * Receive challenge and session keys, decrypt the challenge and @@ -403,7 +405,7 @@ static void client_post_select(struct sched *s, struct task *t) hash_to_asc(ct->challenge_hash, buf); PARA_INFO_LOG("--> %s\n", buf); ct->status = CL_RECEIVED_CHALLENGE; - return; + return 0; } case CL_RECEIVED_CHALLENGE: if (ct->use_sideband) { @@ -444,20 +446,20 @@ static void client_post_select(struct sched *s, struct task *t) if (!strstr(buf, PROCEED_MSG)) goto out; ct->status = CL_RECEIVED_PROCEED; - return; + return 0; } case CL_RECEIVED_PROCEED: /* concat args and send command */ { int i; char *command = NULL; if (!FD_ISSET(ct->scc.fd, &s->wfds)) - return; + return 0; if (ct->use_sideband) { ret = send_sb_command(ct); if (ret <= 0) goto out; ct->status = CL_SENT_COMMAND; - return; + return 0; } for (i = 0; i < ct->conf.inputs_num; i++) { char *tmp = command; @@ -472,7 +474,7 @@ static void client_post_select(struct sched *s, struct task *t) if (ret < 0) goto out; ct->status = CL_SENT_COMMAND; - return; + return 0; } case CL_SENT_COMMAND: { @@ -498,7 +500,7 @@ static void client_post_select(struct sched *s, struct task *t) if (strstr(buf2, AWAITING_DATA_MSG)) { free(buf2); ct->status = CL_SENDING; - return; + return 0; } ct->status = CL_RECEIVING; btr_add_output(buf2, n, btrn); @@ -514,15 +516,15 @@ static void client_post_select(struct sched *s, struct task *t) if (ret < 0) goto out; if (ret == 0) - return; + return 0; if (!FD_ISSET(ct->scc.fd, &s->wfds)) - return; + return 0; sz = btr_next_buffer(btrn, &buf2); ret = sc_send_bin_buffer(&ct->scc, buf2, sz); if (ret < 0) goto out; btr_consume(btrn, sz); - return; + return 0; } case CL_RECEIVING: { @@ -531,13 +533,13 @@ static void client_post_select(struct sched *s, struct task *t) if (ret < 0) goto out; if (ret == 0) - return; + return 0; /* * The FD_ISSET() is not strictly necessary, but is allows us * to skip the malloc below if there is nothing to read anyway. */ if (!FD_ISSET(ct->scc.fd, &s->rfds)) - return; + return 0; if (ct->use_sideband) { struct sb_buffer sbb; ret = recv_sb(ct, &s->rfds, &sbb); @@ -556,13 +558,13 @@ static void client_post_select(struct sched *s, struct task *t) } } out: - t->error = ret; if (ret < 0) { if (!ct->use_sideband && ret != -E_SERVER_EOF && ret != -E_BTR_EOF && ret != -E_EOF) - PARA_ERROR_LOG("%s\n", para_strerror(-t->error)); + PARA_ERROR_LOG("%s\n", para_strerror(-ret)); btr_remove_node(&ct->btrn); } + return ret; } /**