summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/strutils.h3
-rw-r--r--lib/strutils.c12
-rw-r--r--sys-utils/rtcwake.c19
3 files changed, 22 insertions, 12 deletions
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 <string.h>
#include <sys/types.h>
#include <ctype.h>
+#include <stdio.h>
/* 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);