X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fua_input.c;h=3c9af2500e407c108ad22e8b09cd0f22012941d4;hb=c47244310936864c0e9aaf1784a87c2436e58fd3;hp=0bb7922057ca981adc1db8773c2372a22b4686b4;hpb=d65fe741efdc674ff42d3c5cee82f70c3eade4b8;p=bacula%2Fbacula diff --git a/bacula/src/dird/ua_input.c b/bacula/src/dird/ua_input.c index 0bb7922057..3c9af2500e 100644 --- a/bacula/src/dird/ua_input.c +++ b/bacula/src/dird/ua_input.c @@ -1,35 +1,41 @@ /* - * - * Bacula Director -- User Agent Input and scanning code - * - * Kern Sibbald, October MMI - * - * Version $Id$ - */ + Bacula® - The Network Backup Solution -/* - Copyright (C) 2000-2003 Kern Sibbald and John Walker + Copyright (C) 2001-2008 Free Software Foundation Europe e.V. - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. + The main author of Bacula is Kern Sibbald, with contributions from + many others, a complete list can be found in the file AUTHORS. + This program is Free Software; you can redistribute it and/or + modify it under the terms of version two of the GNU General Public + License as published by the Free Software Foundation and included + in the file LICENSE. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public - License along with this program; if not, write to the Free - Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + Bacula® is a registered trademark of John Walker. + The licensor of Bacula is the Free Software Foundation Europe + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. +*/ +/* + * + * Bacula Director -- User Agent Input and scanning code + * + * Kern Sibbald, October MMI + * + * Version $Id$ */ #include "bacula.h" #include "dird.h" -#include "ua.h" /* Imported variables */ @@ -37,153 +43,152 @@ /* Exported functions */ -int get_cmd(UAContext *ua, char *prompt) +int get_cmd(UAContext *ua, const char *prompt) { BSOCK *sock = ua->UA_sock; int stat; ua->cmd[0] = 0; - if (!sock) { /* No UA */ + if (!sock || ua->batch) { /* No UA or batch mode */ return 0; } - bnet_fsend(sock, "%s", prompt); - bnet_sig(sock, BNET_PROMPT); /* request more input */ + sock->fsend("%s", prompt); + sock->signal(BNET_PROMPT); /* request more input */ for ( ;; ) { - stat = bnet_recv(sock); + stat = sock->recv(); if (stat == BNET_SIGNAL) { - continue; /* ignore signals */ + continue; /* ignore signals */ } if (is_bnet_stop(sock)) { - return 0; /* error or terminate */ + return 0; /* error or terminate */ } - ua->cmd = 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); + 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: false if failure + * true if success => value in ua->pint32_val */ -char *next_arg(char **s) +bool get_pint(UAContext *ua, const char *prompt) { - char *p, *q, *n; - int in_quote = 0; - - /* skip past spaces to next arg */ - for (p=*s; *p && *p == ' '; ) { - p++; - } - Dmsg1(400, "Next arg=%s\n", p); - for (n = q = p; *p ; ) { - if (*p == '\\') { - p++; - if (*p) { - *q++ = *p++; - } else { - *q++ = *p; - } - continue; + double dval; + ua->pint32_val = 0; + ua->int64_val = 0; + for (;;) { + ua->cmd[0] = 0; + if (!get_cmd(ua, prompt)) { + return false; } - if (*p == '"') { /* start or end of quote */ - if (in_quote) { - p++; /* skip quote */ - in_quote = 0; - continue; - } - in_quote = 1; - p++; - continue; + /* Kludge for slots blank line => 0 */ + if (ua->cmd[0] == 0 && strncmp(prompt, _("Enter slot"), strlen(_("Enter slot"))) == 0) { + return true; } - if (!in_quote && *p == ' ') { /* end of field */ - p++; - break; + if (!is_a_number(ua->cmd)) { + ua->warning_msg(_("Expected a positive integer, got: %s\n"), ua->cmd); + continue; } - *q++ = *p++; + errno = 0; + dval = strtod(ua->cmd, NULL); + if (errno != 0 || dval < 0) { + ua->warning_msg(_("Expected a positive integer, got: %s\n"), ua->cmd); + continue; + } + ua->pint32_val = (uint32_t)dval; + ua->int64_val = (int64_t)dval; + return true; } - *q = 0; - *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] = + * Test a yes or no response + * Returns: false if failure + * true if success => ret == 1 for yes + * ret == 0 for no */ +bool is_yesno(char *val, int *ret) +{ + *ret = 0; + if ((strcasecmp(val, _("yes")) == 0) || + (strcasecmp(val, NT_("yes")) == 0)) + { + *ret = 1; + } else if ((strcasecmp(val, _("no")) == 0) || + (strcasecmp(val, NT_("no")) == 0)) + { + *ret = 0; + } else { + return false; + } + + return true; +} -void parse_command_args(UAContext *ua) +/* + * Gets a yes or no response + * Returns: false if failure + * true if success => ua->pint32_val == 1 for yes + * ua->pint32_val == 0 for no + */ +bool get_yesno(UAContext *ua, const char *prompt) { - char *p, *q, *n; - int i, len; - - len = strlen(ua->cmd) + 1; - ua->args = check_pool_memory_size(ua->args, len); - bstrncpy(ua->args, ua->cmd, len); - 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; + int ret; + ua->pint32_val = 0; + for (;;) { + if (ua->api) ua->UA_sock->signal(BNET_YESNO); + if (!get_cmd(ua, prompt)) { + return false; } - } - /* Separate keyword and value */ - for (i=0; iargc; i++) { - p = strchr(ua->argk[i], '='); - if (p) { - *p++ = 0; /* terminate keyword and point to value */ - /* Unquote quoted values */ - if (*p == '"') { - for (n = q = ++p; *p && *p != '"'; ) { - if (*p == '\\') { - p++; - } - *q++ = *p++; - } - *q = 0; /* terminate string */ - p = n; /* point to string */ - } - 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; + } + if (is_yesno(ua->cmd, &ret)) { + ua->pint32_val = ret; + return true; } - ua->argv[i] = p; /* save ptr to value or NULL */ + ua->warning_msg(_("Invalid response. You must answer yes or no.\n")); } -#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"); +} + +/* + * Gets an Enabled value => 0, 1, 2, yes, no, archived + * Returns: 0, 1, 2 if OK + * -1 on error + */ +int get_enabled(UAContext *ua, const char *val) +{ + int Enabled = -1; + + if (strcasecmp(val, "yes") == 0 || strcasecmp(val, "true") == 0) { + Enabled = 1; + } else if (strcasecmp(val, "no") == 0 || strcasecmp(val, "false") == 0) { + Enabled = 0; + } else if (strcasecmp(val, "archived") == 0) { + Enabled = 2; + } else { + Enabled = atoi(val); } -#endif + if (Enabled < 0 || Enabled > 2) { + ua->error_msg(_("Invalid Enabled value, it must be yes, no, archived, 0, 1, or 2\n")); + return -1; + } + return Enabled; +} + +void parse_ua_args(UAContext *ua) +{ + parse_args(ua->cmd, &ua->args, &ua->argc, ua->argk, ua->argv, MAX_CMD_ARGS); }