[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