X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=client_common.c;h=e34ed641401c7b91f612e8e5922c0fbd19baa0ac;hb=e151dbb79eac16326585ec0a33cf48029f5f22f4;hp=bb421e3ab81c3a28a724f89c84a8c24f993d86e0;hpb=9de1287d67c9562e9140c6dc7deb0c01c4e10cc0;p=paraslash.git diff --git a/client_common.c b/client_common.c index bb421e3a..e34ed641 100644 --- a/client_common.c +++ b/client_common.c @@ -42,6 +42,7 @@ void client_disconnect(struct client_task *ct) return; if (ct->scc.fd >= 0) close(ct->scc.fd); + free_argv(ct->features); sc_free(ct->scc.recv); ct->scc.recv = NULL; sc_free(ct->scc.send); @@ -152,6 +153,31 @@ static int client_recv_buffer(struct client_task *ct, fd_set *rfds, return 0; } +static char **parse_features(char *buf) +{ + int i; + const char id[] = "\nFeatures: "; + char *p, *q, **features; + + p = strstr(buf, id); + if (!p) + return NULL; + p += strlen(id); + q = strchr(p, '\n'); + if (!q) + return NULL; + *q = '\0'; + create_argv(p, ",", &features); + for (i = 0; features[i]; i++) + PARA_INFO_LOG("server feature: %s\n", features[i]); + return features; +} + +static bool has_feature(const char *feature, struct client_task *ct) +{ + return find_arg(feature, ct->features) >= 0? true : false; +} + /** * The post select hook for client commands. * @@ -181,14 +207,19 @@ static void client_post_select(struct sched *s, struct task *t) ret = client_recv_buffer(ct, &s->rfds, buf, sizeof(buf), &n); if (ret < 0 || n == 0) goto out; + ct->features = parse_features(buf); ct->status = CL_RECEIVED_WELCOME; return; case CL_RECEIVED_WELCOME: /* send auth command */ - sprintf(buf, AUTH_REQUEST_MSG "%s", ct->user); - PARA_INFO_LOG("--> %s\n", buf); if (!FD_ISSET(ct->scc.fd, &s->wfds)) return; - ret = send_buffer(ct->scc.fd, buf); + if (has_feature("sideband", ct)) { + ct->use_sideband = true; + sprintf(buf, AUTH_REQUEST_MSG "%s sideband", ct->user); + } else + sprintf(buf, AUTH_REQUEST_MSG "%s", ct->user); + PARA_INFO_LOG("--> %s\n", buf); + ret = write_buffer(ct->scc.fd, buf); if (ret < 0) goto out; ct->status = CL_SENT_AUTH; @@ -218,8 +249,7 @@ static void client_post_select(struct sched *s, struct task *t) SESSION_KEY_LEN); hash_to_asc(challenge_hash, buf); PARA_INFO_LOG("--> %s\n", buf); - ret = send_bin_buffer(ct->scc.fd, (char *)challenge_hash, - HASH_SIZE); + ret = write_all(ct->scc.fd, (char *)challenge_hash, HASH_SIZE); if (ret < 0) goto out; ct->status = CL_SENT_CH_RESPONSE;