X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=client_common.c;h=cf77acd81beda8b79c1df5b607626c57975b3506;hp=d8eaba66cc9b7d704f1479b80fab8709bc53f674;hb=7cb521f3eeb7fda02344c523989d5903251e673e;hpb=3fd92b8735671b309fa775312b7cba1f6c7a6b32 diff --git a/client_common.c b/client_common.c index d8eaba66..cf77acd8 100644 --- a/client_common.c +++ b/client_common.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1997-2008 Andre Noll + * Copyright (C) 1997-2009 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -64,6 +64,7 @@ void client_close(struct client_task *ct) disable_crypt(ct->fd); close(ct->fd); } + free(ct->buf); free(ct->user); free(ct->config_file); free(ct->key_file); @@ -190,15 +191,15 @@ static void client_post_select(struct sched *s, struct task *t) t->error = client_recv_buffer(ct); if (t->error < 0) return; - if (t->error != 64) { + if (t->error < 64) { t->error = -E_INVALID_CHALLENGE; PARA_ERROR_LOG("received the following: %s\n", ct->buf); return; } - PARA_INFO_LOG("<-- [challenge]\n"); + PARA_INFO_LOG("<-- [challenge] (%d bytes)\n", t->error); /* decrypt challenge number */ t->error = para_decrypt_challenge(ct->key_file, &ct->challenge_nr, - (unsigned char *) ct->buf, 64); + (unsigned char *) ct->buf, t->error); if (t->error > 0) ct->status = CL_RECEIVED_CHALLENGE; return; @@ -312,6 +313,7 @@ err_out: * \param argv Usual argument vector. * \param ct_ptr Points to dynamically allocated and initialized client task * struct upon successful return. + * \param loglevel If not \p NULL, the number of the loglevel is stored here. * * 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. @@ -319,16 +321,19 @@ err_out: * * \return Standard. */ -int client_open(int argc, char *argv[], struct client_task **ct_ptr) +int client_open(int argc, char *argv[], struct client_task **ct_ptr, + int *loglevel) { char *home = para_homedir(); - struct stat statbuf; int ret; struct client_task *ct = para_calloc(sizeof(struct client_task)); + ct->buf = para_malloc(CLIENT_BUFSIZE); *ct_ptr = ct; ct->fd = -1; - ret = client_cmdline_parser(argc, argv, &ct->conf); + ret = -E_CLIENT_SYNTAX; + if (client_cmdline_parser(argc, argv, &ct->conf)) + goto out; HANDLE_VERSION_FLAG("client", ct->conf); ret = -E_CLIENT_SYNTAX; if (!ct->conf.inputs_num) @@ -343,23 +348,27 @@ int client_open(int argc, char *argv[], struct client_task **ct_ptr) ct->config_file = ct->conf.config_file_given? para_strdup(ct->conf.config_file_arg) : make_message("%s/.paraslash/client.conf", home); - ret = stat(ct->config_file, &statbuf); - if (ret && ct->conf.config_file_given) { + ret = file_exists(ct->config_file); + if (!ret && ct->conf.config_file_given) { ret = -E_NO_CONFIG; goto out; } - if (!ret) { + if (ret) { struct client_cmdline_parser_params params = { .override = 0, .initialize = 0, .check_required = 0, - .check_ambiguity = 0 + .check_ambiguity = 0, + .print_errors = 0 }; - client_cmdline_parser_config_file(ct->config_file, - &ct->conf, ¶ms); + ret = -E_BAD_CONFIG; + if (client_cmdline_parser_config_file(ct->config_file, + &ct->conf, ¶ms)) + goto out; } - ret = 1; - PARA_INFO_LOG("loglevel: %d\n", ct->conf.loglevel_arg); + if (loglevel) + *loglevel = get_loglevel_by_name(ct->conf.loglevel_arg); + PARA_INFO_LOG("loglevel: %s\n", ct->conf.loglevel_arg); PARA_INFO_LOG("config_file: %s\n", ct->config_file); PARA_INFO_LOG("key_file: %s\n", ct->key_file); PARA_NOTICE_LOG("connecting %s:%d\n", ct->conf.hostname_arg, @@ -374,4 +383,3 @@ out: } return ret; } -