[CRIU] [PATCH] posix-timer: make parser a bit more readable
Andrey Vagin
avagin at openvz.org
Tue Jul 2 12:37:18 EDT 2013
Cc: Pavel Tikhomirov <snorcht at gmail.com>
Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
proc_parse.c | 83 +++++++++++++++---------------------------------------------
1 file changed, 20 insertions(+), 63 deletions(-)
diff --git a/proc_parse.c b/proc_parse.c
index 57311ec..b4ba80c 100644
--- a/proc_parse.c
+++ b/proc_parse.c
@@ -1161,27 +1161,14 @@ err:
int parse_posix_timers(pid_t pid, struct proc_posix_timers_stat *args)
{
- int i;
int ret = 0;
- int get = 0;
int pid_t;
FILE * file;
- char * line1 = NULL;
- char * line2 = NULL;
- char * line3 = NULL;
- char * line4 = NULL;
- size_t len1 = 0;
- size_t len2 = 0;
- size_t len3 = 0;
- size_t len4 = 0;
-
- char * siginfo;
- char siginfo_tmp[20];
+
char sigpid[7];
char tidpid[4];
- char str_name[10];
struct proc_posix_timer *timer = NULL;
INIT_LIST_HEAD(&args->timers);
@@ -1198,39 +1185,24 @@ int parse_posix_timers(pid_t pid, struct proc_posix_timers_stat *args)
}
while (1) {
- get = getline(&line1, &len1, file);
- if (get == -1)
- goto end_posix;
- get = getline(&line2, &len2, file);
- if (get == -1)
- goto end_posix;
- get = getline(&line3, &len3, file);
- if (get == -1)
- goto end_posix;
- get = getline(&line4, &len4, file);
- if (get == -1)
- goto end_posix;
-
timer = xzalloc(sizeof(struct proc_posix_timer));
+ if (timer == NULL)
+ goto err;
- ret = sscanf(line1, "%s %ld", str_name, &timer->spt.it_id);
- if (ret != 2 || str_name[0] != 'I')
- goto parse_err_posix;
- ret = sscanf(line2, "%s %d%s", str_name, &timer->spt.si_signo, siginfo_tmp);
- if (ret != 3 || str_name[0] != 's')
- goto parse_err_posix;
- siginfo=&siginfo_tmp[1];
- ret = sscanf(siginfo, "%p", &timer->spt.sival_ptr);
- if (ret != 1)
- goto parse_err_posix;
- for (i = 0; i<len3; i++) {
- if (line3[i] == '/' || line3[i] == '.') {
- line3[i] = ' ';
- }
+ ret = fscanf(file, "ID: %ld\n"
+ "signal: %d/%p\n"
+ "notify: %6[a-z]/%3[a-z].%d\n"
+ "ClockID: %d\n",
+ &timer->spt.it_id,
+ &timer->spt.si_signo, &timer->spt.sival_ptr,
+ sigpid, tidpid, &pid_t,
+ &timer->spt.clock_id);
+ if (ret != 7) {
+ ret = 0;
+ if (feof(file))
+ goto out;
+ goto err;
}
- ret = sscanf(line3, "%s %s %s %d", str_name, sigpid, tidpid, &pid_t);
- if (ret != 4 || str_name[0] != 'n')
- goto parse_err_posix;
if ( tidpid[0] == 't') {
timer->spt.it_sigev_notify = SIGEV_THREAD_ID;
@@ -1248,14 +1220,12 @@ int parse_posix_timers(pid_t pid, struct proc_posix_timers_stat *args)
}
}
- ret = sscanf(line4, "%s %d", str_name, &timer->spt.clock_id);
- if (ret != 2 || str_name[0] != 'C')
- goto parse_err_posix;
list_add(&timer->list, &args->timers);
timer = NULL;
args->timer_n++;
}
-parse_err_posix:
+err:
+ xfree(timer);
while (!list_empty(&args->timers)) {
timer = list_first_entry(&args->timers, struct proc_posix_timer, list);
list_del(&timer->list);
@@ -1263,20 +1233,7 @@ parse_err_posix:
}
pr_perror("Parse error in posix timers proc file!");
ret = -1;
-end_posix:
- if (ferror(file)) {
- ret = -1;
- pr_perror("getline");
- }
-
- if (line1)
- free(line1);
- if (line2)
- free(line2);
- if (line3)
- free(line3);
-
- if (file != NULL)
- fclose(file);
+out:
+ fclose(file);
return ret;
}
--
1.8.3.1
More information about the CRIU
mailing list