diff --git a/criu/include/proc_parse.h b/criu/include/proc_parse.h index 0f5e91056..c68566130 100644 --- a/criu/include/proc_parse.h +++ b/criu/include/proc_parse.h @@ -108,5 +108,6 @@ int parse_children(pid_t pid, pid_t **_c, int *_n); extern bool is_vma_range_fmt(char *line); extern void parse_vmflags(char *buf, u32 *flags, u64 *madv, int *io_pf); +extern int parse_uptime(struct timeval *_tv); #endif /* __CR_PROC_PARSE_H__ */ diff --git a/criu/proc_parse.c b/criu/proc_parse.c index 4ab11a31a..5aabed1eb 100644 --- a/criu/proc_parse.c +++ b/criu/proc_parse.c @@ -2712,3 +2712,27 @@ err: xfree(ch); return -1; } + +__maybe_unused int parse_uptime(struct timeval *_tv) +{ + unsigned long sec, csec; + FILE *f; + + f = fopen("/proc/uptime", "r"); + if (!f) { + pr_perror("Failed to fopen /proc/uptime"); + return -1; + } + + if (fscanf(f, "%lu.%2lu", &sec, &csec) != 2) { + pr_perror("Failed to parse /proc/uptime"); + fclose(f); + return -1; + } + + _tv->tv_sec = sec; + _tv->tv_usec = csec * (USEC_PER_SEC / 100); + + fclose(f); + return 0; +}