diff options
author | Denis Vlasenko | 2008-07-16 22:12:18 +0000 |
---|---|---|
committer | Denis Vlasenko | 2008-07-16 22:12:18 +0000 |
commit | c01340fe26b76e172805ff641ad9af6bc45cdc91 (patch) | |
tree | 1b3b57ef2fd7441bb91410b89f763056279baddf /miscutils | |
parent | 38e54f1c1384e76adafb4e611a6bd456e4351d42 (diff) | |
download | busybox-c01340fe26b76e172805ff641ad9af6bc45cdc91.zip busybox-c01340fe26b76e172805ff641ad9af6bc45cdc91.tar.gz |
update of config file parser from Vladimir
Diffstat (limited to 'miscutils')
-rw-r--r-- | miscutils/crond.c | 83 |
1 files changed, 34 insertions, 49 deletions
diff --git a/miscutils/crond.c b/miscutils/crond.c index e48abf9..af37bb1 100644 --- a/miscutils/crond.c +++ b/miscutils/crond.c @@ -304,7 +304,7 @@ static const char MonAry[] ALIGN1 = /* "Jan""Feb""Mar""Apr""May""Jun""Jul""Aug""Sep""Oct""Nov""Dec" */ ; -static char *ParseField(char *user, char *ary, int modvalue, int off, +static void ParseField(char *user, char *ary, int modvalue, int off, const char *names, char *ptr) /* 'names' is a pointer to a set of 3-char abbreviations */ { @@ -312,11 +312,11 @@ static char *ParseField(char *user, char *ary, int modvalue, int off, int n1 = -1; int n2 = -1; - if (base == NULL) { - return NULL; - } + // this can't happen due to config_read() + /*if (base == NULL) + return;*/ - while (!isspace(*ptr)) { + while (1) { int skip = 0; /* Handle numeric digit or symbol or '*' */ @@ -352,8 +352,7 @@ static char *ParseField(char *user, char *ary, int modvalue, int off, /* handle optional range '-' */ if (skip == 0) { - crondlog(WARN9 "user %s: parse error at %s", user, base); - return NULL; + goto err; } if (*ptr == '-' && n2 < 0) { ++ptr; @@ -388,8 +387,7 @@ static char *ParseField(char *user, char *ary, int modvalue, int off, s0 = skip; } if (--failsafe == 0) { - crondlog(WARN9 "user %s: parse error at %s", user, base); - return NULL; + goto err; } } while (n1 != n2); @@ -402,9 +400,10 @@ static char *ParseField(char *user, char *ary, int modvalue, int off, n2 = -1; } - if (!isspace(*ptr)) { + if (*ptr) { + err: crondlog(WARN9 "user %s: parse error at %s", user, base); - return NULL; + return; } if (DebugOpt && (LogLevel <= 5)) { /* like LVL5 */ @@ -414,7 +413,6 @@ static char *ParseField(char *user, char *ary, int modvalue, int off, fprintf(stderr, "%d", (unsigned char)ary[i]); fputc('\n', stderr); } - return skip_whitespace(ptr); } static void FixDayDow(CronLine *line) @@ -445,11 +443,10 @@ static void FixDayDow(CronLine *line) static void SynchronizeFile(const char *fileName) { - FILE *fi; + struct parser_t parser; struct stat sbuf; - int maxEntries; int maxLines; - char buf[1024]; + char *tokens[6]; #if ENABLE_FEATURE_CROND_CALL_SENDMAIL char *mailTo = NULL; #endif @@ -458,57 +455,44 @@ static void SynchronizeFile(const char *fileName) return; DeleteFile(fileName); - fi = fopen(fileName, "r"); - if (!fi) + if (!config_open(&parser, fileName)) return; - maxEntries = MAXLINES; - if (strcmp(fileName, "root") == 0) { - maxEntries = 65535; - } - maxLines = maxEntries * 10; + maxLines = (strcmp(fileName, "root") == 0) ? 65535 : MAXLINES; - if (fstat(fileno(fi), &sbuf) == 0 && sbuf.st_uid == DaemonUid) { + if (fstat(fileno(parser.fp), &sbuf) == 0 && sbuf.st_uid == DaemonUid) { CronFile *file = xzalloc(sizeof(CronFile)); CronLine **pline; + int n; file->cf_User = xstrdup(fileName); pline = &file->cf_LineBase; - while (fgets(buf, sizeof(buf), fi) != NULL && --maxLines) { + while (--maxLines && (n=config_read(&parser, tokens, 6, 0, " \t", '#')) > 0) { CronLine *line; - char *ptr; - trim(buf); - if (buf[0] == '\0' || buf[0] == '#') { - continue; - } - if (--maxEntries == 0) { - break; - } if (DebugOpt) { - crondlog(LVL5 "user:%s entry:%s", fileName, buf); + crondlog(LVL5 "user:%s entry:%s", fileName, parser.data); } + /* check if line is setting MAILTO= */ - if (0 == strncmp("MAILTO=", buf, 7)) { + if (0 == strncmp(tokens[0], "MAILTO=", 7)) { #if ENABLE_FEATURE_CROND_CALL_SENDMAIL free(mailTo); - mailTo = (buf[7]) ? xstrdup(buf+7) : NULL; + mailTo = (tokens[0][7]) ? xstrdup(&tokens[0][7]) : NULL; #endif /* otherwise just ignore such lines */ continue; } + /* check if a minimum of tokens is specified */ + if (n < 5) + continue; *pline = line = xzalloc(sizeof(CronLine)); /* parse date ranges */ - ptr = ParseField(file->cf_User, line->cl_Mins, 60, 0, NULL, buf); - ptr = ParseField(file->cf_User, line->cl_Hrs, 24, 0, NULL, ptr); - ptr = ParseField(file->cf_User, line->cl_Days, 32, 0, NULL, ptr); - ptr = ParseField(file->cf_User, line->cl_Mons, 12, -1, MonAry, ptr); - ptr = ParseField(file->cf_User, line->cl_Dow, 7, 0, DowAry, ptr); - /* check failure */ - if (ptr == NULL) { - free(line); - continue; - } + ParseField(file->cf_User, line->cl_Mins, 60, 0, NULL, tokens[0]); + ParseField(file->cf_User, line->cl_Hrs, 24, 0, NULL, tokens[1]); + ParseField(file->cf_User, line->cl_Days, 32, 0, NULL, tokens[2]); + ParseField(file->cf_User, line->cl_Mons, 12, -1, MonAry, tokens[3]); + ParseField(file->cf_User, line->cl_Dow, 7, 0, DowAry, tokens[4]); /* * fix days and dow - if one is not "*" and the other * is "*", the other is set to 0, and vise-versa @@ -519,22 +503,23 @@ static void SynchronizeFile(const char *fileName) line->cl_MailTo = xstrdup(mailTo); #endif /* copy command */ - line->cl_Shell = xstrdup(ptr); + line->cl_Shell = xstrdup(tokens[5]); if (DebugOpt) { - crondlog(LVL5 " command:%s", ptr); + crondlog(LVL5 " command:%s", tokens[5]); } pline = &line->cl_Next; +//bb_error_msg("M[%s]F[%s][%s][%s][%s][%s][%s]", mailTo, tokens[0], tokens[1], tokens[2], tokens[3], tokens[4], tokens[5]); } *pline = NULL; file->cf_Next = FileBase; FileBase = file; - if (maxLines == 0 || maxEntries == 0) { + if (maxLines == 0) { crondlog(WARN9 "user %s: too many lines", fileName); } } - fclose(fi); + config_close(&parser); } static void CheckUpdates(void) |