X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fua_input.c;h=39c4e33ebff8582d8e82da27b91d9ab737cb3900;hb=cc4be3a7c0b43ad093d008707277de22ddffc4a3;hp=7aa673016045b70da17eb45b5c0d2cc0633af224;hpb=5483b82f16f28424ca126db50f7bf71e53023e3e;p=bacula%2Fbacula diff --git a/bacula/src/dird/ua_input.c b/bacula/src/dird/ua_input.c index 7aa6730160..39c4e33ebf 100644 --- a/bacula/src/dird/ua_input.c +++ b/bacula/src/dird/ua_input.c @@ -8,7 +8,7 @@ */ /* - Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker + Copyright (C) 2000-2003 Kern Sibbald and John Walker This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -29,7 +29,6 @@ #include "bacula.h" #include "dird.h" -#include "ua.h" /* Imported variables */ @@ -40,6 +39,7 @@ int get_cmd(UAContext *ua, char *prompt) { BSOCK *sock = ua->UA_sock; + int stat; ua->cmd[0] = 0; if (!sock) { /* No UA */ @@ -48,122 +48,87 @@ int get_cmd(UAContext *ua, char *prompt) bnet_fsend(sock, "%s", prompt); bnet_sig(sock, BNET_PROMPT); /* request more input */ for ( ;; ) { - if (bnet_recv(sock) < 0) { - return 0; + stat = bnet_recv(sock); + if (stat == BNET_SIGNAL) { + continue; /* ignore signals */ + } + if (is_bnet_stop(sock)) { + return 0; /* error or terminate */ } - ua->cmd = (char *) check_pool_memory_size(ua->cmd, sock->msglen+1); - bstrncpy(ua->cmd, sock->msg, sock->msglen+1); + pm_strcpy(&ua->cmd, sock->msg); strip_trailing_junk(ua->cmd); if (strcmp(ua->cmd, ".messages") == 0) { qmessagescmd(ua, ua->cmd); } - /* ****FIXME**** if .command, go off and do it. For now ignore it. */ - if (ua->cmd[0] == '.' && ua->cmd[1] != 0) { - continue; /* dot command */ + /* Lone dot => break */ + if (ua->cmd[0] == '.' && ua->cmd[1] == 0) { + return 0; } - /* Lone dot => break or actual response */ break; } return 1; } /* - * Return next argument from command line. Note, this - * routine is destructive. + * Get a positive integer + * Returns: 0 if failure + * 1 if success => value in ua->pint32_val */ -char *next_arg(char **s) +int get_pint(UAContext *ua, char *prompt) { - char *p, *q, *n; - - Dmsg1(400, "Next arg=%s\n", *s); - /* skip past spaces to next arg */ - for (p=*s; *p && *p == ' '; ) { - p++; - } - /* Determine start of argument */ - if (*p == '"') { - Dmsg0(400, "Start with quote.\n"); - for (n = q = ++p; *p && *p != '"'; ) { - if (*p == '\\') { - p++; - } - *q++ = *p++; - } - p++; /* skip terminating quote */ - for ( ; *p && *p != ' '; ) { - *q++ = *p++; + double dval; + ua->pint32_val = 0; + for (;;) { + if (!get_cmd(ua, prompt)) { + return 0; } - *q = 0; - } else { - /* Scan argment and terminate it */ - n = p; - for ( ; *p && *p != ' '; ) { - p++; + if (!is_a_number(ua->cmd)) { + bsendmsg(ua, "Expected a positive integer, got: %s\n", ua->cmd); + continue; } - if (*p == ' ') { - *p++ = 0; + errno = 0; + dval = strtod(ua->cmd, NULL); + if (errno != 0 || dval < 0) { + bsendmsg(ua, "Expected a positive integer, got: %s\n", ua->cmd); + continue; } + ua->pint32_val = (uint32_t)dval; + return 1; } - *s = p; - Dmsg2(400, "End arg=%s next=%s\n", n, p); - return n; -} +} -/* - * This routine parses the input command line. - * It makes a copy in args, then builds an - * argc, argv like list where - * - * argc = count of arguments - * argk[i] = argument keyword (part preceding =) - * argv[i] = argument value (part after =) - * - * example: arg1 arg2=abc arg3= - * - * argc = c - * argk[0] = arg1 - * argv[0] = NULL - * argk[1] = arg2 - * argv[1] = abc - * argk[2] = arg3 - * argv[2] = +/* + * Gets a yes or no response + * Returns: 0 if failure + * 1 if success => ua->pint32_val == 1 for yes + * ua->pint32_val == 0 for no */ - -void parse_command_args(UAContext *ua) +int get_yesno(UAContext *ua, char *prompt) { - BSOCK *sock = ua->UA_sock; - char *p, *n; - int i; - - ua->args = (char *) check_pool_memory_size(ua->args, sock->msglen+1); - bstrncpy(ua->args, sock->msg, sock->msglen+1); - strip_trailing_junk(ua->args); - ua->argc = 0; - p = ua->args; - /* Pick up all arguments */ - while (ua->argc < MAX_ARGS) { - n = next_arg(&p); - if (*n) { - ua->argk[ua->argc++] = n; - } else { - break; + int len; + + ua->pint32_val = 0; + for (;;) { + if (!get_cmd(ua, prompt)) { + return 0; } - } - /* Separate keyword and value */ - for (i=0; iargc; i++) { - p = strchr(ua->argk[i], '='); - if (p) { - *p++ = 0; /* terminate keyword and point to value */ - if (strlen(p) > MAX_NAME_LENGTH-1) { - p[MAX_NAME_LENGTH-1] = 0; /* truncate to max len */ - } + len = strlen(ua->cmd); + if (len < 1 || len > 3) { + continue; } - ua->argv[i] = p; /* save ptr to value or NULL */ - } -#ifdef xxxx - for (i=0; iargc; i++) { - Dmsg3(000, "Arg %d: kw=%s val=%s\n", i, - ua->argk[i], ua->argv[i]?ua->argv[i]:"NULL"); + if (strncasecmp(ua->cmd, _("yes"), len) == 0) { + ua->pint32_val = 1; + return 1; + } + if (strncasecmp(ua->cmd, _("no"), len) == 0) { + return 1; + } + bsendmsg(ua, _("Invalid response. You must answer yes or no.\n")); } -#endif +} + + +void parse_ua_args(UAContext *ua) +{ + parse_args(ua->cmd, &ua->args, &ua->argc, ua->argk, ua->argv, MAX_CMD_ARGS); }