- switch(tok) {
- case CONF_INT:
- if (tokenval.v.i != 0)
- val = 1;
- else
- val = 0;
- break;
-
- case CONF_LONG:
- if (tokenval.v.l != 0L)
- val = 1;
- else
- val = 0;
- break;
-
- case CONF_SIZE:
- if (tokenval.v.size != (size_t)0)
- val = 1;
- else
- val = 0;
- break;
-
- case CONF_AM64:
- if (tokenval.v.am64 != (off_t)0)
- val = 1;
- else
- val = 0;
- break;
-
- case CONF_ATRUE:
- val = 1;
- break;
-
- case CONF_AFALSE:
- val = 0;
- break;
-
- case CONF_NL:
- unget_conftoken();
- val = 2; /* no argument - most likely TRUE */
- break;
- default:
- unget_conftoken();
- val = 3; /* a bad argument - most likely TRUE */
- conf_parserror("YES, NO, TRUE, FALSE, ON, OFF expected");
- break;
- }
-
- keytable = save_kt;
- return val;
-}
-
-void
-ckseen(
- int *seen)
-{
- if (*seen && !allow_overwrites && conf_line_num != -2) {
- conf_parserror("duplicate parameter, prev def on line %d", *seen);
- }
- *seen = conf_line_num;
-}
-
-printf_arglist_function(void conf_parserror, const char *, format)
-{
- va_list argp;
-
- /* print error message */
-
- if(conf_line)
- fprintf(stderr, "argument \"%s\": ", conf_line);
- else
- fprintf(stderr, "\"%s\", line %d: ", conf_confname, conf_line_num);
- arglist_start(argp, format);
- vfprintf(stderr, format, argp);
- arglist_end(argp);
- fputc('\n', stderr);
-
- got_parserror = 1;
-}
-
-tok_t
-lookup_keyword(
- char * str)
-{
- keytab_t *kwp;
-
- /* switch to binary search if performance warrants */
-
- for(kwp = keytable; kwp->keyword != NULL; kwp++) {
- if (strcmp(kwp->keyword, str) == 0) break;
- }
- return kwp->token;
-}
-
-char tkbuf[4096];
-
-/* push the last token back (can only unget ANY tokens) */
-void
-unget_conftoken(void)
-{
- token_pushed = 1;
- pushed_tok = tok;
- tok = CONF_UNKNOWN;
- return;
-}
-
-int
-conftoken_getc(void)
-{
- if(conf_line == NULL)
- return getc(conf_conf);
- if(*conf_char == '\0')
- return -1;
- return(*conf_char++);
-}
-
-int
-conftoken_ungetc(
- int c)
-{
- if(conf_line == NULL)
- return ungetc(c, conf_conf);
- else if(conf_char > conf_line) {
- if(c == -1)
- return c;
- conf_char--;
- if(*conf_char != c) {
- error("*conf_char != c : %c %c", *conf_char, c);
- /* NOTREACHED */
- }
- } else {
- error("conf_char == conf_line");
- /* NOTREACHED */
- }
- return c;
-}
-
-void
-get_conftoken(
- tok_t exp)
-{
- int ch, d;
- off_t am64;
- char *buf;
- char *tmps;
- int token_overflow;
- int inquote = 0;
- int escape = 0;
- int sign;
-
- if (token_pushed) {
- token_pushed = 0;
- tok = pushed_tok;
-
- /*
- ** If it looked like a key word before then look it
- ** up again in the current keyword table.
- */
- switch(tok) {
- case CONF_LONG: case CONF_AM64: case CONF_SIZE:
- case CONF_INT: case CONF_REAL: case CONF_STRING:
- case CONF_LBRACE: case CONF_RBRACE: case CONF_COMMA:
- case CONF_NL: case CONF_END: case CONF_UNKNOWN:
- case CONF_TIME:
- break;
-
- default:
- if (exp == CONF_IDENT)
- tok = CONF_IDENT;
- else
- tok = lookup_keyword(tokenval.v.s);
- break;
- }
- }
- else {
- ch = conftoken_getc();
-
- while(ch != EOF && ch != '\n' && isspace(ch))
- ch = conftoken_getc();
- if (ch == '#') { /* comment - eat everything but eol/eof */
- while((ch = conftoken_getc()) != EOF && ch != '\n') {
- (void)ch; /* Quiet empty loop complaints */
- }
- }
-
- if (isalpha(ch)) { /* identifier */
- buf = tkbuf;
- token_overflow = 0;
- do {
- if (islower(ch)) ch = toupper(ch);
- if (buf < tkbuf+sizeof(tkbuf)-1) {
- *buf++ = (char)ch;
- } else {
- *buf = '\0';
- if (!token_overflow) {
- conf_parserror("token too long: %.20s...", tkbuf);
- }
- token_overflow = 1;
- }
- ch = conftoken_getc();
- } while(isalnum(ch) || ch == '_' || ch == '-');
-
- if (ch != EOF && conftoken_ungetc(ch) == EOF) {
- if (ferror(conf_conf)) {
- conf_parserror("Pushback of '%c' failed: %s",
- ch, strerror(ferror(conf_conf)));
- } else {
- conf_parserror("Pushback of '%c' failed: EOF", ch);
- }
- }
- *buf = '\0';
-
- tokenval.v.s = tkbuf;
-
- if (token_overflow) tok = CONF_UNKNOWN;
- else if (exp == CONF_IDENT) tok = CONF_IDENT;
- else tok = lookup_keyword(tokenval.v.s);
- }
- else if (isdigit(ch)) { /* integer */
- sign = 1;
-
-negative_number: /* look for goto negative_number below sign is set there */
- am64 = 0;
- do {
- am64 = am64 * 10 + (ch - '0');
- ch = conftoken_getc();
- } while (isdigit(ch));
-
- if (ch != '.') {
- if (exp == CONF_INT) {
- tok = CONF_INT;
- tokenval.v.i = sign * (int)am64;
- } else if (exp == CONF_LONG) {
- tok = CONF_LONG;
- tokenval.v.l = (long)sign * (long)am64;
- } else if (exp != CONF_REAL) {
- tok = CONF_AM64;
- tokenval.v.am64 = (off_t)sign * am64;
- } else {
- /* automatically convert to real when expected */
- tokenval.v.r = (double)sign * (double)am64;
- tok = CONF_REAL;
- }
- } else {
- /* got a real number, not an int */
- tokenval.v.r = sign * (double) am64;
- am64 = 0;
- d = 1;
- ch = conftoken_getc();
- while (isdigit(ch)) {
- am64 = am64 * 10 + (ch - '0');
- d = d * 10;
- ch = conftoken_getc();
- }
- tokenval.v.r += sign * ((double)am64) / d;
- tok = CONF_REAL;
- }
-
- if (ch != EOF && conftoken_ungetc(ch) == EOF) {
- if (ferror(conf_conf)) {
- conf_parserror("Pushback of '%c' failed: %s",
- ch, strerror(ferror(conf_conf)));
- } else {
- conf_parserror("Pushback of '%c' failed: EOF", ch);
- }
- }
- } else switch(ch) {
- case '"': /* string */
- buf = tkbuf;
- token_overflow = 0;
- inquote = 1;
- *buf++ = (char)ch;
- while (inquote && ((ch = conftoken_getc()) != EOF)) {
- if (ch == '\n') {
- if (!escape)
- break;
- escape = 0;
- buf--; /* Consume escape in buffer */
- } else if (ch == '\\') {
- escape = 1;
- } else {
- if (ch == '"') {
- if (!escape)
- inquote = 0;
- }
- escape = 0;
- }
-
- if(buf >= &tkbuf[sizeof(tkbuf) - 1]) {
- if (!token_overflow) {
- conf_parserror("string too long: %.20s...", tkbuf);
- }
- token_overflow = 1;
- break;
- }
- *buf++ = (char)ch;
- }
- *buf = '\0';
-
- /*
- * A little manuver to leave a fully unquoted, unallocated string
- * in tokenval.v.s
- */
- tmps = unquote_string(tkbuf);
- strncpy(tkbuf, tmps, sizeof(tkbuf));
- amfree(tmps);
- tokenval.v.s = tkbuf;
-
- tok = (token_overflow) ? CONF_UNKNOWN :
- (exp == CONF_IDENT) ? CONF_IDENT : CONF_STRING;
- break;
-
- case '-':
- ch = conftoken_getc();
- if (isdigit(ch)) {
- sign = -1;
- goto negative_number;
- }
- else {
- if (ch != EOF && conftoken_ungetc(ch) == EOF) {
- if (ferror(conf_conf)) {
- conf_parserror("Pushback of '%c' failed: %s",
- ch, strerror(ferror(conf_conf)));
- } else {
- conf_parserror("Pushback of '%c' failed: EOF", ch);
- }
- }
- tok = CONF_UNKNOWN;
- }
- break;
-
- case ',':
- tok = CONF_COMMA;
- break;
-
- case '{':
- tok = CONF_LBRACE;
- break;
-
- case '}':
- tok = CONF_RBRACE;
- break;
-
- case '\n':
- tok = CONF_NL;
- break;
-
- case EOF:
- tok = CONF_END;
- break;
-
- default:
- tok = CONF_UNKNOWN;
- break;
- }
- }
-
- if (exp != CONF_ANY && tok != exp) {
- char *str;
- keytab_t *kwp;
-
- switch(exp) {
- case CONF_LBRACE:
- str = "\"{\"";
- break;
-
- case CONF_RBRACE:
- str = "\"}\"";
- break;
-
- case CONF_COMMA:
- str = "\",\"";
- break;
-
- case CONF_NL:
- str = "end of line";
- break;
-
- case CONF_END:
- str = "end of file";
- break;
-
- case CONF_INT:
- str = "an integer";
- break;
-
- case CONF_REAL:
- str = "a real number";
- break;
-
- case CONF_STRING:
- str = "a quoted string";
- break;
-
- case CONF_IDENT:
- str = "an identifier";
- break;
-
- default:
- for(kwp = keytable; kwp->keyword != NULL; kwp++) {
- if (exp == kwp->token)
- break;
- }
- if (kwp->keyword == NULL)
- str = "token not";
- else
- str = kwp->keyword;
- break;
- }
- conf_parserror("%s is expected", str);
- tok = exp;
- if (tok == CONF_INT)
- tokenval.v.i = 0;
- else
- tokenval.v.s = "";
- }
-}
-
-
-void
-read_string(
- t_conf_var *np,
- val_t *val)
-{
- np = np;
- ckseen(&val->seen);
- get_conftoken(CONF_STRING);
- val->v.s = newstralloc(val->v.s, tokenval.v.s);
-}
-
-void
-read_ident(
- t_conf_var *np,
- val_t *val)
-{
- np = np;
- ckseen(&val->seen);
- get_conftoken(CONF_IDENT);
- val->v.s = newstralloc(val->v.s, tokenval.v.s);
-}
-
-void
-read_int(
- t_conf_var *np,
- val_t *val)
-{
- np = np;
- ckseen(&val->seen);
- val->v.i = get_int();
-}
-
-void
-read_long(
- t_conf_var *np,
- val_t *val)
-{
- np = np;
- ckseen(&val->seen);
- val->v.l = get_long();
-}
-
-void
-read_size(
- t_conf_var *np,
- val_t *val)
-{
- np = np;
- ckseen(&val->seen);
- val->v.size = get_size();
-}
-
-void
-read_am64(
- t_conf_var *np,
- val_t *val)
-{
- np = np;
- ckseen(&val->seen);
- val->v.am64 = get_am64_t();
-}
-
-void
-read_bool(
- t_conf_var *np,
- val_t *val)
-{
- np = np;
- ckseen(&val->seen);
- val->v.i = get_bool();
-}
-
-void
-read_real(
- t_conf_var *np,
- val_t *val)
-{
- np = np;
- ckseen(&val->seen);
- get_conftoken(CONF_REAL);
- val->v.r = tokenval.v.r;
-}
-
-void
-read_time(
- t_conf_var *np,
- val_t *val)
-{
- np = np;
- ckseen(&val->seen);
- val->v.t = get_time();
-}
-
-void
-copy_val_t(
- val_t *valdst,
- val_t *valsrc)
-{
- if(valsrc->seen) {
- valdst->type = valsrc->type;
- valdst->seen = valsrc->seen;
- switch(valsrc->type) {
- case CONFTYPE_INT:
- case CONFTYPE_BOOL:
- case CONFTYPE_COMPRESS:
- case CONFTYPE_ENCRYPT:
- case CONFTYPE_HOLDING:
- case CONFTYPE_ESTIMATE:
- case CONFTYPE_STRATEGY:
- case CONFTYPE_TAPERALGO:
- case CONFTYPE_PRIORITY:
- valdst->v.i = valsrc->v.i;
- break;
-
- case CONFTYPE_LONG:
- valdst->v.l = valsrc->v.l;
- break;
-
- case CONFTYPE_SIZE:
- valdst->v.size = valsrc->v.size;
- break;
-
- case CONFTYPE_AM64:
- valdst->v.am64 = valsrc->v.am64;
- break;
-
- case CONFTYPE_REAL:
- valdst->v.r = valsrc->v.r;
- break;
-
- case CONFTYPE_RATE:
- valdst->v.rate[0] = valsrc->v.rate[0];
- valdst->v.rate[1] = valsrc->v.rate[1];
- break;
-
- case CONFTYPE_IDENT:
- case CONFTYPE_STRING:
- valdst->v.s = stralloc(valsrc->v.s);
- break;
-
- case CONFTYPE_TIME:
- valdst->v.t = valsrc->v.t;
- break;
-
- case CONFTYPE_SL:
- valdst->v.sl = duplicate_sl(valsrc->v.sl);
- break;
-
- case CONFTYPE_EXINCLUDE:
- valdst->v.exinclude.type = valsrc->v.exinclude.type;
- valdst->v.exinclude.optional = valsrc->v.exinclude.optional;
- valdst->v.exinclude.sl = duplicate_sl(valsrc->v.exinclude.sl);
- break;
- }
- }
-}
-
-void
-free_val_t(
- val_t *val)
-{
- switch(val->type) {
- case CONFTYPE_INT:
- case CONFTYPE_BOOL:
- case CONFTYPE_COMPRESS:
- case CONFTYPE_ENCRYPT:
- case CONFTYPE_HOLDING:
- case CONFTYPE_ESTIMATE:
- case CONFTYPE_STRATEGY:
- case CONFTYPE_SIZE:
- case CONFTYPE_TAPERALGO:
- case CONFTYPE_PRIORITY:
- case CONFTYPE_LONG:
- case CONFTYPE_AM64:
- case CONFTYPE_REAL:
- case CONFTYPE_RATE:
- break;
-
- case CONFTYPE_IDENT:
- case CONFTYPE_STRING:
- amfree(val->v.s);
- break;
-
- case CONFTYPE_TIME:
- break;
-
- case CONFTYPE_SL:
- free_sl(val->v.sl);
- break;
-
- case CONFTYPE_EXINCLUDE:
- free_sl(val->v.exinclude.sl);
- break;
- }
- val->seen = 0;
-}
-
-char *
-taperalgo2str(
- int taperalgo)
-{
- if(taperalgo == ALGO_FIRST) return "FIRST";
- if(taperalgo == ALGO_FIRSTFIT) return "FIRSTFIT";
- if(taperalgo == ALGO_LARGEST) return "LARGEST";
- if(taperalgo == ALGO_LARGESTFIT) return "LARGESTFIT";
- if(taperalgo == ALGO_SMALLEST) return "SMALLEST";
- if(taperalgo == ALGO_LAST) return "LAST";
- return "UNKNOWN";
-}
-
-static char buffer_conf_print[1025];
-
-char *
-conf_print(
- val_t *val)
-{
- struct tm *stm;
- int pos;
-
- buffer_conf_print[0] = '\0';
- switch(val->type) {
- case CONFTYPE_INT:
- snprintf(buffer_conf_print, SIZEOF(buffer_conf_print), "%d", val->v.i);
- break;
-
- case CONFTYPE_LONG:
- snprintf(buffer_conf_print, SIZEOF(buffer_conf_print), "%ld", val->v.l);
- break;
-
- case CONFTYPE_SIZE:
- snprintf(buffer_conf_print, SIZEOF(buffer_conf_print), SSIZE_T_FMT,
- (SSIZE_T_FMT_TYPE)val->v.size);
- break;
-
- case CONFTYPE_AM64:
- snprintf(buffer_conf_print, SIZEOF(buffer_conf_print), OFF_T_FMT ,
- (OFF_T_FMT_TYPE)val->v.am64);
- break;
-
- case CONFTYPE_REAL:
- snprintf(buffer_conf_print, SIZEOF(buffer_conf_print), "%0.5f" , val->v.r);
- break;
-
- case CONFTYPE_RATE:
- snprintf(buffer_conf_print, SIZEOF(buffer_conf_print), "%0.5f %0.5f" , val->v.rate[0], val->v.rate[1]);
- break;
-
- case CONFTYPE_IDENT:
- if(val->v.s) {
- strncpy(buffer_conf_print, val->v.s, SIZEOF(buffer_conf_print));
- buffer_conf_print[SIZEOF(buffer_conf_print) - 1] = '\0';
- } else
- buffer_conf_print[0] = '\0';
- break;
-
- case CONFTYPE_STRING:
- buffer_conf_print[0] = '"';
- if(val->v.s) {
- strncpy(&buffer_conf_print[1], val->v.s,
- SIZEOF(buffer_conf_print) - 1);
- buffer_conf_print[SIZEOF(buffer_conf_print) - 2] = '\0';
- buffer_conf_print[strlen(buffer_conf_print)] = '"';
- } else {
- buffer_conf_print[1] = '"';
- buffer_conf_print[2] = '\0';
- }
- break;
-
- case CONFTYPE_TIME:
- stm = localtime(&val->v.t);
- if (stm) {
- snprintf(buffer_conf_print, SIZEOF(buffer_conf_print),
- "%d%02d%02d", stm->tm_hour, stm->tm_min, stm->tm_sec);
- } else {
- strcpy(buffer_conf_print, "00000");
- }
- break;
-
- case CONFTYPE_SL:
- buffer_conf_print[0] = '\0';
- break;
-
- case CONFTYPE_EXINCLUDE:
- buffer_conf_print[0] = '\0';
- if(val->v.exinclude.type == 0)
- strncpy(buffer_conf_print, "LIST ", SIZEOF(buffer_conf_print));
- else
- strncpy(buffer_conf_print, "FILE ", SIZEOF(buffer_conf_print));
- pos = 5;
- if(val->v.exinclude.optional == 1)
- strncpy(&buffer_conf_print[pos], "OPTIONAL ", SIZEOF(buffer_conf_print));
- pos += 9;
- break;
-
- case CONFTYPE_BOOL:
- if(val->v.i)
- strncpy(buffer_conf_print, "yes", SIZEOF(buffer_conf_print));
- else
- strncpy(buffer_conf_print, "no", SIZEOF(buffer_conf_print));
- break;
-
- case CONFTYPE_STRATEGY:
- switch(val->v.i) {
- case DS_SKIP:
- strncpy(buffer_conf_print, "SKIP", SIZEOF(buffer_conf_print));
- break;
-
- case DS_STANDARD:
- strncpy(buffer_conf_print, "STANDARD", SIZEOF(buffer_conf_print));
- break;
-
- case DS_NOFULL:
- strncpy(buffer_conf_print, "NOFULL", SIZEOF(buffer_conf_print));
- break;
-
- case DS_NOINC:
- strncpy(buffer_conf_print, "NOINC", SIZEOF(buffer_conf_print));
- break;
-
- case DS_HANOI:
- strncpy(buffer_conf_print, "HANOI", SIZEOF(buffer_conf_print));
- break;
-
- case DS_INCRONLY:
- strncpy(buffer_conf_print, "INCRONLY", SIZEOF(buffer_conf_print));
- break;
- }
- break;
-
- case CONFTYPE_COMPRESS:
- switch(val->v.i) {
- case COMP_NONE:
- strncpy(buffer_conf_print, "NONE", SIZEOF(buffer_conf_print));
- break;
-
- case COMP_FAST:
- strncpy(buffer_conf_print, "CLIENT FAST", SIZEOF(buffer_conf_print));
- break;
-
- case COMP_BEST:
- strncpy(buffer_conf_print, "CLIENT BEST", SIZEOF(buffer_conf_print));
- break;
-
- case COMP_CUST:
- strncpy(buffer_conf_print, "CLIENT CUSTOM", SIZEOF(buffer_conf_print));
- break;
-
- case COMP_SERV_FAST:
- strncpy(buffer_conf_print, "SERVER FAST", SIZEOF(buffer_conf_print));
- break;
-
- case COMP_SERV_BEST:
- strncpy(buffer_conf_print, "SERVER FAST", SIZEOF(buffer_conf_print));
- break;
-
- case COMP_SERV_CUST:
- strncpy(buffer_conf_print, "SERVER CUSTOM", SIZEOF(buffer_conf_print));
- break;
- }
- break;
-
- case CONFTYPE_ESTIMATE:
- switch(val->v.i) {
- case ES_CLIENT:
- strncpy(buffer_conf_print, "CLIENT", SIZEOF(buffer_conf_print));
- break;
-
- case ES_SERVER:
- strncpy(buffer_conf_print, "SERVER", SIZEOF(buffer_conf_print));
- break;
-
- case ES_CALCSIZE:
- strncpy(buffer_conf_print, "CALCSIZE", SIZEOF(buffer_conf_print));
- break;
- }
- break;
-
- case CONFTYPE_ENCRYPT:
- switch(val->v.i) {
- case ENCRYPT_NONE:
- strncpy(buffer_conf_print, "NONE", SIZEOF(buffer_conf_print));
- break;
-
- case ENCRYPT_CUST:
- strncpy(buffer_conf_print, "CLIENT", SIZEOF(buffer_conf_print));
- break;
-
- case ENCRYPT_SERV_CUST:
- strncpy(buffer_conf_print, "SERVER", SIZEOF(buffer_conf_print));
- break;
- }
- break;
-
- case CONFTYPE_HOLDING:
- switch(val->v.i) {
- case HOLD_NEVER:
- strncpy(buffer_conf_print, "NEVER", SIZEOF(buffer_conf_print));
- break;
-
- case HOLD_AUTO:
- strncpy(buffer_conf_print, "AUTO", SIZEOF(buffer_conf_print));
- break;
-
- case HOLD_REQUIRED:
- strncpy(buffer_conf_print, "REQUIRED", SIZEOF(buffer_conf_print));
- break;
- }
- break;
-
- case CONFTYPE_TAPERALGO:
- strncpy(buffer_conf_print, taperalgo2str(val->v.i), SIZEOF(buffer_conf_print));
- break;
-
- case CONFTYPE_PRIORITY:
- switch(val->v.i) {
- case 0:
- strncpy(buffer_conf_print, "LOW", SIZEOF(buffer_conf_print));
- break;
-
- case 1:
- strncpy(buffer_conf_print, "MEDIUM", SIZEOF(buffer_conf_print));
- break;
-
- case 2:
- strncpy(buffer_conf_print, "HIGH", SIZEOF(buffer_conf_print));
- break;
- }
- break;
- }
- buffer_conf_print[SIZEOF(buffer_conf_print) - 1] = '\0';
- return buffer_conf_print;
-}
-
-void
-conf_init_string(
- val_t *val,
- char *s)
-{
- val->seen = 0;
- val->type = CONFTYPE_STRING;
- if(s)
- val->v.s = stralloc(s);
- else
- val->v.s = NULL;
-}
-
-void
-conf_init_ident(
- val_t *val,
- char *s)
-{
- val->seen = 0;
- val->type = CONFTYPE_IDENT;
- if(s)
- val->v.s = stralloc(s);
- else
- val->v.s = NULL;
-}