]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/dird/ua_input.c
This commit was manufactured by cvs2svn to create tag
[bacula/bacula] / bacula / src / dird / ua_input.c
1 /*
2  *
3  *   Bacula Director -- User Agent Input and scanning code
4  *
5  *     Kern Sibbald, October MMI
6  *
7  *   Version $Id$
8  */
9
10 /*
11    Copyright (C) 2000-2003 Kern Sibbald and John Walker
12
13    This program is free software; you can redistribute it and/or
14    modify it under the terms of the GNU General Public License as
15    published by the Free Software Foundation; either version 2 of
16    the License, or (at your option) any later version.
17
18    This program is distributed in the hope that it will be useful,
19    but WITHOUT ANY WARRANTY; without even the implied warranty of
20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21    General Public License for more details.
22
23    You should have received a copy of the GNU General Public
24    License along with this program; if not, write to the Free
25    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
26    MA 02111-1307, USA.
27
28  */
29
30 #include "bacula.h"
31 #include "dird.h"
32
33
34 /* Imported variables */
35
36
37 /* Exported functions */
38
39 int get_cmd(UAContext *ua, char *prompt)
40 {
41    BSOCK *sock = ua->UA_sock;
42    int stat;
43
44    ua->cmd[0] = 0;
45    if (!sock) {                       /* No UA */
46       return 0;
47    }
48    bnet_fsend(sock, "%s", prompt);
49    bnet_sig(sock, BNET_PROMPT);       /* request more input */
50    for ( ;; ) {
51       stat = bnet_recv(sock);
52       if (stat == BNET_SIGNAL) {
53          continue;                    /* ignore signals */
54       }
55       if (is_bnet_stop(sock)) {
56          return 0;                    /* error or terminate */
57       }
58       pm_strcpy(&ua->cmd, sock->msg);
59       strip_trailing_junk(ua->cmd);
60       if (strcmp(ua->cmd, ".messages") == 0) {
61          qmessagescmd(ua, ua->cmd);
62       }
63       /* Lone dot => break */
64       if (ua->cmd[0] == '.' && ua->cmd[1] == 0) {
65          return 0;
66       }
67       break;
68    }
69    return 1;
70 }
71
72 /* 
73  * Get a positive integer
74  *  Returns:  0 if failure
75  *            1 if success => value in ua->pint32_val
76  */
77 int get_pint(UAContext *ua, char *prompt)
78 {
79    double dval;
80    ua->pint32_val = 0;
81    for (;;) {
82       if (!get_cmd(ua, prompt)) {
83          return 0;
84       }
85       if (!is_a_number(ua->cmd)) {
86          bsendmsg(ua, "Expected a positive integer, got: %s\n", ua->cmd);
87          continue;
88       }
89       errno = 0;
90       dval = strtod(ua->cmd, NULL);
91       if (errno != 0 || dval < 0) {
92          bsendmsg(ua, "Expected a positive integer, got: %s\n", ua->cmd);
93          continue;
94       }
95       ua->pint32_val = (uint32_t)dval;
96       return 1;
97    }
98 }
99
100 /* 
101  * Gets a yes or no response
102  *  Returns:  0 if failure
103  *            1 if success => ua->pint32_val == 1 for yes
104  *                            ua->pint32_val == 0 for no
105  */
106 int get_yesno(UAContext *ua, char *prompt)
107 {
108    int len;
109
110    ua->pint32_val = 0;
111    for (;;) {
112       if (!get_cmd(ua, prompt)) {
113          return 0;
114       }
115       len = strlen(ua->cmd);
116       if (len < 1 || len > 3) {
117          continue;
118       }
119       if (strncasecmp(ua->cmd, _("yes"), len) == 0) {
120          ua->pint32_val = 1;
121          return 1;
122       }
123       if (strncasecmp(ua->cmd, _("no"), len) == 0) {
124          return 1;
125       }
126       bsendmsg(ua, _("Invalid response. You must answer yes or no.\n"));
127    }
128 }
129   
130
131 void parse_ua_args(UAContext *ua)
132 {
133    parse_args(ua->cmd, &ua->args, &ua->argc, ua->argk, ua->argv, MAX_CMD_ARGS);
134 }