diff --git a/include/strutils.h b/include/strutils.h index 9eb9c8127..ec2a8acd6 100644 --- a/include/strutils.h +++ b/include/strutils.h @@ -6,6 +6,7 @@ #include #include #include +#include /* default strtoxx_or_err() exit code */ #ifndef STRTOXX_EXIT_CODE @@ -207,4 +208,6 @@ extern char *strnappend(const char *s, const char *suffix, size_t b); extern char *strappend(const char *s, const char *suffix); extern const char *split(const char **state, size_t *l, const char *separator, int quoted); +extern int skip_fline(FILE *fp); + #endif diff --git a/lib/strutils.c b/lib/strutils.c index cc90e043d..ebfc5110b 100644 --- a/lib/strutils.c +++ b/lib/strutils.c @@ -859,6 +859,18 @@ const char *split(const char **state, size_t *l, const char *separator, int quot return current; } +/* Rewind file pointer forward to new line. */ +int skip_fline(FILE *fp) +{ + char ch; + + do { + if ((ch = fgetc(fp)) == EOF) + return 1; + if (ch == '\n') + return 0; + } while (1); +} #ifdef TEST_PROGRAM diff --git a/sys-utils/rtcwake.c b/sys-utils/rtcwake.c index 3c8238d27..6d67fc26a 100644 --- a/sys-utils/rtcwake.c +++ b/sys-utils/rtcwake.c @@ -47,7 +47,7 @@ #define RTC_AF 0x20 #define RTC_UF 0x10 -#define MAX_LINE 1024 +#define ADJTIME_ZONE_STRLEN 8 #define RTC_PATH "/sys/class/rtc/%s/device/power/wakeup" #define SYS_POWER_STATE_PATH "/sys/power/state" @@ -294,30 +294,23 @@ static void suspend_system(struct rtcwake_control *ctl, int suspend) errx(EXIT_FAILURE, _("write error")); } - static int read_clock_mode(struct rtcwake_control *ctl) { FILE *fp; - char linebuf[MAX_LINE]; + char linebuf[ADJTIME_ZONE_STRLEN]; fp = fopen(ctl->adjfile, "r"); if (!fp) return -1; - /* skip first line */ - if (!fgets(linebuf, MAX_LINE, fp)) { - fclose(fp); - return -1; - } - - /* skip second line */ - if (!fgets(linebuf, MAX_LINE, fp)) { + /* skip two lines */ + if (skip_fline(fp) || skip_fline(fp)) { fclose(fp); return -1; } /* read third line */ - if (!fgets(linebuf, MAX_LINE, fp)) { + if (!fgets(linebuf, sizeof linebuf, fp)) { fclose(fp); return -1; } @@ -326,6 +319,8 @@ static int read_clock_mode(struct rtcwake_control *ctl) ctl->clock_mode = CM_UTC; else if (strncmp(linebuf, "LOCAL", 5) == 0) ctl->clock_mode = CM_LOCAL; + else if (ctl->verbose) + warnx(_("unexpected third line in: %s: %s"), ctl->adjfile, linebuf); fclose(fp);