#include "para.h"
#include "config.h"
-#include <readline/readline.h>
-#include <readline/history.h>
#include "client.cmdline.h"
#include "crypt.h"
#include "rc4.h"
#include "net.h"
#include "string.h"
-/* A static variable for holding the line. */
-static char *line_read;
-
struct gengetopt_args_info args_info;
/*
* client log function
*/
-void para_log(int ll, char* fmt,...)
+void para_log(int ll, const char* fmt,...)
{
va_list argp;
FILE *outfd;
va_end(argp);
}
-/*
- * Read a string, and return a pointer to it. Returns NULL on EOF.
- */
-static char *rl_gets(void)
-{
- free(line_read);
- /* Get a line from the user. */
- line_read = readline("para_client> ");
- /* If the line has any text in it, save it on the history. */
- if (line_read && *line_read)
- add_history(line_read);
- return line_read;
-}
-
-/*
- * do several cleanups on sigint
- */
-static void sigint_handler(__unused int i)
-{
- rl_cleanup_after_signal();
- rl_reset_after_signal();
-}
-
void get_options(int argc, char *argv[],
char **config_file, char **key_file)
{
int main(int argc, char *argv[])
{
- int sockfd, numbytes, i, interactive, received, ret;
+ int sockfd, numbytes, i, received, ret;
struct hostent *he;
struct sockaddr_in their_addr;
char *command = NULL;
char *auth_str;
char *key_file, *config_file;
long unsigned challenge_nr;
- char *line;
get_options(argc, argv, &config_file, &key_file);
if (args_info.loglevel_arg <= NOTICE)
args_info.hostname_arg,
args_info.server_port_arg
);
- interactive = args_info.inputs_num == 0? 1 : 0;
- if (interactive) {
- PARA_NOTICE_LOG("%s", "no command, entering interactive mode\n");
- signal(SIGINT, sigint_handler);
- } else {
- /* not interactive, concat args */
- for (i = 0; i < args_info.inputs_num; i++)
- append_str(&command, args_info.inputs[i]);
+ if (!args_info.inputs_num) {
+ PARA_ERROR_LOG("%s", "syntax error\n");
+ exit(EXIT_FAILURE);
}
-interactive_loop:
+ /* concat args */
+ for (i = 0; i < args_info.inputs_num; i++)
+ append_str(&command, args_info.inputs[i]);
+
crypt_function_recv = NULL;
crypt_function_send = NULL;
- if (interactive) {
- int i = 0;
- char *p;
-
- rl_save_prompt();
- rl_message("\n");
- rl_kill_full_line(0, 0);
- rl_free_line_state();
- /* read a line via readline */
- line = rl_gets();
- if (!line)
- return 0;
- if (!line[0])
- goto interactive_loop;
- p = line;
- while (sscanf(p, "%200s%n", buf, &i) == 1) {
- append_str(&command, buf);
- p += i;
- }
- }
/* get the host info */
PARA_NOTICE_LOG("getting host info of %s\n",
args_info.hostname_arg);
numbytes);
buf[numbytes] = '\0';
PARA_ERROR_LOG("received the following instead: %s\n", buf);
- goto write_out;
+ exit(EXIT_FAILURE);
}
PARA_INFO_LOG("<-- [challenge (%i bytes)]\n", numbytes);
/* decrypt challenge number */
if (send_buffer(sockfd, EOC_MSG "\n") < 0)
exit(EXIT_FAILURE);
PARA_NOTICE_LOG("%s", "command sent.\n");
-write_out:
received = 0;
- /* write server output to stdout */
- while ((numbytes = recv_bin_buffer(sockfd, buf, sizeof(buf))) > 0) {
- int ret;
-
+ while ((numbytes = recv_bin_buffer(sockfd, buf, sizeof(buf) - 1)) > 0) {
+ buf[numbytes] = '\0';
if (!received && strstr(buf, AWAITING_DATA_MSG)) {
- PARA_NOTICE_LOG("%s", "<-- awaiting data\n");
- PARA_NOTICE_LOG("%s", "--> sending stdin\n");
+ PARA_NOTICE_LOG("%s", "sending stdin\n");
while ((ret = read(STDIN_FILENO, buf,
- sizeof(buf))) > 0)
- send_bin_buffer(sockfd, buf, ret);
+ sizeof(buf))) > 0) {
+ if (send_bin_buffer(sockfd, buf, ret) < 0)
+ break;
+ }
PARA_NOTICE_LOG("%s", "closing connection\n");
numbytes = 1;
break;
if (!numbytes)
PARA_NOTICE_LOG("%s", "connection closed by peer\n");
close(sockfd);
- if (interactive)
- goto interactive_loop;
- return 0;
+ return ret >= 0? 0: 1;
}