Imported Upstream version 2.5.1
[debian/amanda] / common-src / util.h
1 /*
2  * Amanda, The Advanced Maryland Automatic Network Disk Archiver
3  * Copyright (c) 1999 University of Maryland at College Park
4  * All Rights Reserved.
5  *
6  * Permission to use, copy, modify, distribute, and sell this software and its
7  * documentation for any purpose is hereby granted without fee, provided that
8  * the above copyright notice appear in all copies and that both that
9  * copyright notice and this permission notice appear in supporting
10  * documentation, and that the name of U.M. not be used in advertising or
11  * publicity pertaining to distribution of the software without specific,
12  * written prior permission.  U.M. makes no representations about the
13  * suitability of this software for any purpose.  It is provided "as is"
14  * without express or implied warranty.
15  *
16  * U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M.
18  * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
20  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
21  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22  *
23  * Authors: the Amanda Development Team.  Its members are listed in a
24  * file named AUTHORS, in the root directory of this distribution.
25  */
26 /*
27  * $Id: util.h,v 1.17 2006/07/26 15:17:36 martinea Exp $
28  */
29 #ifndef UTIL_H
30 #define UTIL_H
31
32 #include "amanda.h"
33 #include "sl.h"
34
35 /* */
36 typedef enum {
37     CONFTYPE_INT,
38     CONFTYPE_LONG,
39     CONFTYPE_AM64,
40     CONFTYPE_REAL,
41     CONFTYPE_STRING,
42     CONFTYPE_IDENT,
43     CONFTYPE_TIME,
44     CONFTYPE_SIZE,
45     CONFTYPE_SL,
46     CONFTYPE_BOOL,
47     CONFTYPE_COMPRESS,
48     CONFTYPE_ENCRYPT,
49     CONFTYPE_HOLDING,
50     CONFTYPE_ESTIMATE,
51     CONFTYPE_STRATEGY,
52     CONFTYPE_TAPERALGO,
53     CONFTYPE_PRIORITY,
54     CONFTYPE_RATE,
55     CONFTYPE_EXINCLUDE,
56 } conftype_t;
57
58 /* Compression types */
59 typedef enum {
60     COMP_NONE,          /* No compression */
61     COMP_FAST,          /* Fast compression on client */
62     COMP_BEST,          /* Best compression on client */
63     COMP_CUST,          /* Custom compression on client */
64     COMP_SERV_FAST,     /* Fast compression on server */
65     COMP_SERV_BEST,     /* Best compression on server */
66     COMP_SERV_CUST      /* Custom compression on server */
67 } comp_t;
68
69 /* Encryption types */
70 typedef enum {
71     ENCRYPT_NONE,               /* No encryption */
72     ENCRYPT_CUST,               /* Custom encryption on client */
73     ENCRYPT_SERV_CUST,          /* Custom encryption on server */
74 } encrypt_t;
75
76 /* holdingdisk types */
77 typedef enum {
78     HOLD_NEVER,                 /* Always direct to tape  */
79     HOLD_AUTO,                  /* If possible            */
80     HOLD_REQUIRED               /* Always to holding disk */
81 } dump_holdingdisk_t;
82
83 /* Dump strategies */
84 #define DS_SKIP         0       /* Don't do any dumps at all */
85 #define DS_STANDARD     1       /* Standard (0 1 1 1 1 2 2 2 ...) */
86 #define DS_NOFULL       2       /* No full's (1 1 1 ...) */
87 #define DS_NOINC        3       /* No inc's (0 0 0 ...) */
88 #define DS_4            4       /* ? (0 1 2 3 4 5 6 7 8 9 10 11 ...) */
89 #define DS_5            5       /* ? (0 1 1 1 1 1 1 1 1 1 1 1 ...) */
90 #define DS_HANOI        6       /* Tower of Hanoi (? ? ? ? ? ...) */
91 #define DS_INCRONLY     7       /* Forced fulls (0 1 1 2 2 FORCE0 1 1 ...) */
92
93 /* Estimate strategies */
94 #define ES_CLIENT       0       /* client estimate */
95 #define ES_SERVER       1       /* server estimate */
96 #define ES_CALCSIZE     2       /* calcsize estimate */
97
98 #define ALGO_FIRST      0
99 #define ALGO_FIRSTFIT   1
100 #define ALGO_LARGEST    2
101 #define ALGO_LARGESTFIT 3
102 #define ALGO_SMALLEST   4
103 #define ALGO_LAST       5
104
105 #define BSTRNCMP(a,b)  strncmp(a, b, strlen(b)) 
106                                                   
107 typedef enum {
108     CONF_UNKNOWN,               CONF_ANY,               CONF_COMMA,
109     CONF_LBRACE,                CONF_RBRACE,            CONF_NL,
110     CONF_END,                   CONF_IDENT,             CONF_INT,
111     CONF_LONG,                  CONF_AM64,              CONF_BOOL,
112     CONF_REAL,                  CONF_STRING,            CONF_TIME,
113     CONF_SIZE,
114
115     /* config parameters */
116     CONF_INCLUDEFILE,           CONF_ORG,               CONF_MAILTO,
117     CONF_DUMPUSER,              CONF_TAPECYCLE,         CONF_TAPEDEV,
118     CONF_CHNGRDEV,              CONF_CHNGRFILE,         CONF_LABELSTR,
119     CONF_BUMPPERCENT,           CONF_BUMPSIZE,          CONF_BUMPDAYS,
120     CONF_BUMPMULT,              CONF_ETIMEOUT,          CONF_DTIMEOUT,
121     CONF_CTIMEOUT,              CONF_TAPEBUFS,          CONF_TAPELIST,
122     CONF_DISKFILE,              CONF_INFOFILE,          CONF_LOGDIR,
123     CONF_LOGFILE,               CONF_DISKDIR,           CONF_DISKSIZE,
124     CONF_INDEXDIR,              CONF_NETUSAGE,          CONF_INPARALLEL,
125     CONF_DUMPORDER,             CONF_TIMEOUT,           CONF_TPCHANGER,
126     CONF_RUNTAPES,              CONF_DEFINE,            CONF_DUMPTYPE,
127     CONF_TAPETYPE,              CONF_INTERFACE,         CONF_PRINTER,
128     CONF_AUTOFLUSH,             CONF_RESERVE,           CONF_MAXDUMPSIZE,
129     CONF_COLUMNSPEC,            CONF_AMRECOVER_DO_FSF,  CONF_AMRECOVER_CHECK_LABEL,
130     CONF_AMRECOVER_CHANGER,     CONF_LABEL_NEW_TAPES,   CONF_USETIMESTAMPS,
131
132     CONF_TAPERALGO,             CONF_FIRST,             CONF_FIRSTFIT,
133     CONF_LARGEST,               CONF_LARGESTFIT,        CONF_SMALLEST,
134     CONF_LAST,                  CONF_DISPLAYUNIT,
135
136     /* kerberos 5 */
137     CONF_KRB5KEYTAB,            CONF_KRB5PRINCIPAL,
138
139     /* holding disk */
140     CONF_COMMENT,               CONF_DIRECTORY,         CONF_USE,
141     CONF_CHUNKSIZE,
142
143     /* dump type */
144     /*COMMENT,*/                CONF_PROGRAM,           CONF_DUMPCYCLE,
145     CONF_RUNSPERCYCLE,          CONF_MAXCYCLE,          CONF_MAXDUMPS,
146     CONF_OPTIONS,               CONF_PRIORITY,          CONF_FREQUENCY,
147     CONF_INDEX,                 CONF_MAXPROMOTEDAY,     CONF_STARTTIME,
148     CONF_COMPRESS,              CONF_ENCRYPT,           CONF_AUTH,
149     CONF_STRATEGY,              CONF_ESTIMATE,          CONF_SKIP_INCR,
150     CONF_SKIP_FULL,             CONF_RECORD,            CONF_HOLDING,
151     CONF_EXCLUDE,               CONF_INCLUDE,           CONF_KENCRYPT,
152     CONF_IGNORE,                CONF_COMPRATE,          CONF_TAPE_SPLITSIZE,
153     CONF_SPLIT_DISKBUFFER,      CONF_FALLBACK_SPLITSIZE,CONF_SRVCOMPPROG,
154     CONF_CLNTCOMPPROG,          CONF_SRV_ENCRYPT,       CONF_CLNT_ENCRYPT,
155     CONF_SRV_DECRYPT_OPT,       CONF_CLNT_DECRYPT_OPT,  CONF_AMANDAD_PATH,
156     CONF_CLIENT_USERNAME,
157
158     /* tape type */
159     /*COMMENT,*/                CONF_BLOCKSIZE,         CONF_FILE_PAD,
160     CONF_LBL_TEMPL,             CONF_FILEMARK,          CONF_LENGTH,
161     CONF_SPEED,
162
163     /* client conf */
164     CONF_CONF,                  CONF_INDEX_SERVER,      CONF_TAPE_SERVER,
165     CONF_SSH_KEYS,              CONF_GNUTAR_LIST_DIR,   CONF_AMANDATES,
166
167     /* network interface */
168     /* COMMENT, */              /* USE, */
169
170     /* dump options (obsolete) */
171     CONF_EXCLUDE_FILE,          CONF_EXCLUDE_LIST,
172
173     /* compress, estimate, encryption */
174     CONF_NONE,                  CONF_FAST,              CONF_BEST,
175     CONF_SERVER,                CONF_CLIENT,            CONF_CALCSIZE,
176     CONF_CUSTOM,
177
178     /* holdingdisk */
179     CONF_NEVER,                 CONF_AUTO,              CONF_REQUIRED,
180
181     /* priority */
182     CONF_LOW,                   CONF_MEDIUM,            CONF_HIGH,
183
184     /* dump strategy */
185     CONF_SKIP,                  CONF_STANDARD,          CONF_NOFULL,
186     CONF_NOINC,                 CONF_HANOI,             CONF_INCRONLY,
187
188     /* exclude list */
189     CONF_LIST,                  CONF_EFILE,             CONF_APPEND,
190     CONF_OPTIONAL,
191
192     /* numbers */
193     CONF_AMINFINITY,            CONF_MULT1,             CONF_MULT7,
194     CONF_MULT1K,                CONF_MULT1M,            CONF_MULT1G,
195
196     /* boolean */
197     CONF_ATRUE,                 CONF_AFALSE,
198
199     CONF_RAWTAPEDEV
200 } tok_t;
201
202 #define BIGINT  INT_MAX
203
204 /* internal types and variables */
205
206 typedef struct {        /* token table entry */
207     char *keyword;
208     tok_t token;
209 } keytab_t;
210
211 keytab_t *keytable;
212
213 typedef struct {
214     char *name;
215     char *value;
216     int   used;
217 } command_option_t;
218
219 typedef struct exinclude_s {
220     int  type;  /* 0=list   1=file */
221     sl_t *sl;
222     int  optional;
223 } exinclude_t;
224
225 typedef struct val_s {
226     union {
227        int              i;
228        long             l;
229        off_t            am64;
230        double           r;
231        char             *s;
232        sl_t             *sl;
233        ssize_t          size;
234        time_t           t;
235        float            rate[2];
236        exinclude_t      exinclude;
237     } v;
238     int seen;
239     conftype_t type;
240 } val_t;
241
242 typedef struct s_conf_var {
243     tok_t       token;
244     conftype_t  type;
245     void        (*read_function) (struct s_conf_var *, val_t*);
246     int         parm;
247     void        (*validate) (struct s_conf_var *, val_t *);
248 } t_conf_var;
249
250 extern int      allow_overwrites;
251 extern int      token_pushed;
252
253 extern tok_t    tok, pushed_tok;
254 extern val_t    tokenval;
255
256 extern int      conf_line_num, got_parserror;
257 extern FILE     *conf_conf;
258 extern char     *conf_confname;
259 extern char     *conf_line;
260 extern char     *conf_char;
261
262 /* predeclare local functions */
263
264 t_conf_var  *get_np(t_conf_var *get_var, int parm);
265 void    get_simple(val_t *var, tok_t type);
266 int     get_int(void);
267 long    get_long(void);
268 time_t  get_time(void);
269 ssize_t get_size(void);
270 off_t   get_am64_t(void);
271 int     get_bool(void);
272 void    ckseen(int *seen);
273 void    conf_parserror(const char *format, ...)
274                 __attribute__ ((format (printf, 1, 2)));
275 tok_t   lookup_keyword(char *str);
276 void    unget_conftoken(void);
277 void    get_conftoken(tok_t exp);
278
279 void read_string(t_conf_var *, val_t *);
280 void read_ident(t_conf_var *, val_t *);
281 void read_int(t_conf_var *, val_t *);
282 void read_long(t_conf_var *, val_t *);
283 void read_size(t_conf_var *, val_t *);
284 void read_am64(t_conf_var *, val_t *);
285 void read_bool(t_conf_var *, val_t *);
286 void read_real(t_conf_var *, val_t *);
287 void read_time(t_conf_var *, val_t *);
288 void copy_val_t(val_t *, val_t *);
289 void free_val_t(val_t *);
290 char *conf_print(val_t *);
291 void conf_init_string(val_t *, char *);
292 void conf_init_ident(val_t *, char *);
293 void conf_init_int(val_t *, int);
294 void conf_init_bool(val_t *, int);
295 void conf_init_strategy(val_t *, int);
296 void conf_init_estimate(val_t *, int);
297 void conf_init_taperalgo(val_t *, int);
298 void conf_init_priority(val_t *, int);
299 void conf_init_strategy(val_t *, int);
300 void conf_init_compress(val_t *, comp_t);
301 void conf_init_encrypt(val_t *, encrypt_t);
302 void conf_init_holding(val_t *, dump_holdingdisk_t);
303 void conf_init_long(val_t *, long);
304 void conf_init_size(val_t *, ssize_t);
305 void conf_init_am64(val_t *, off_t);
306 void conf_init_real(val_t *, double);
307 void conf_init_rate(val_t *, double, double);
308 void conf_init_time(val_t *, time_t);
309 void conf_init_sl(val_t *, sl_t *);
310 void conf_init_exinclude(val_t *);
311 void conf_set_string(val_t *, char *);
312 void conf_set_int(val_t *, int);
313 void conf_set_bool(val_t *, int);
314 void conf_set_compress(val_t *, comp_t);
315 void conf_set_encrypt(val_t *, encrypt_t);
316 void conf_set_holding(val_t *, dump_holdingdisk_t);
317 void conf_set_strategy(val_t *, int);
318 int          get_conftype_int      (val_t *);
319 long         get_conftype_long     (val_t *);
320 off_t        get_conftype_am64     (val_t *);
321 double       get_conftype_real     (val_t *);
322 char        *get_conftype_string   (val_t *);
323 char        *get_conftype_ident    (val_t *);
324 time_t       get_conftype_time     (val_t *);
325 ssize_t      get_conftype_size     (val_t *);
326 sl_t        *get_conftype_sl       (val_t *);
327 int          get_conftype_bool     (val_t *);
328 int          get_conftype_hold     (val_t *);
329 int          get_conftype_compress (val_t *);
330 int          get_conftype_encrypt  (val_t *);
331 int          get_conftype_estimate (val_t *);
332 int          get_conftype_strategy (val_t *);
333 int          get_conftype_taperalgo(val_t *);
334 int          get_conftype_priority (val_t *);
335 float       *get_conftype_rate     (val_t *);
336 exinclude_t  get_conftype_exinclude(val_t *);
337
338 void read_block(command_option_t *command_options, t_conf_var *read_var,
339                 keytab_t *keytab, val_t *valarray, char *prefix, char *errormsg,
340                 int read_brace, void (*copy_function)(void));
341 void command_overwrite(command_option_t *command_options, t_conf_var *overwrite_var,
342                        keytab_t *keytab, val_t *valarray, char *prefix);
343
344
345
346 ssize_t fullread(int, void *, size_t);
347 ssize_t fullwrite(int, const void *, size_t);
348
349 int     connect_portrange(struct sockaddr_in *, in_port_t, in_port_t, char *,
350                           struct sockaddr_in *, int);
351 int     bind_portrange(int, struct sockaddr_in *, in_port_t, in_port_t,
352                        char *);
353
354 char *  construct_datestamp(time_t *t);
355 char *  construct_timestamp(time_t *t);
356
357 /*@only@*//*@null@*/char *quote_string(const char *str);
358 /*@only@*//*@null@*/char *unquote_string(const char *str);
359 int     needs_quotes(const char * str);
360
361 char *  sanitize_string(const char *str);
362 char *  strquotedstr(void);
363 ssize_t hexdump(const char *buffer, size_t bytes);
364 void    dump_sockaddr(struct sockaddr_in *      sa);
365
366 /*
367  *   validate_email return 0 if the following characters are present
368  *   * ( ) < > [ ] , ; : ! $ \ / "
369  *   else returns 1
370  */
371 int validate_mailto(const char *mailto);
372
373 char *taperalgo2str(int taperalgo);
374
375 void free_new_argv(int new_argc, char **new_argv);
376 #endif  /* UTIL_H */