Home | History | Annotate | Download | only in lib
      1 /*
      2  * Copyright (C) 2012-2014 Cyril Hrubis chrubis (at) suse.cz
      3  *
      4  * This program is free software; you can redistribute it and/or modify it
      5  * under the terms of version 2 of the GNU General Public License as
      6  * published by the Free Software Foundation.
      7  *
      8  * This program is distributed in the hope that it would be useful, but
      9  * WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     11  *
     12  * Further, this software is distributed without any warranty that it is
     13  * free of the rightful claim of any third person regarding infringement
     14  * or the like.  Any license provided herein, whether implied or
     15  * otherwise, applies only to this software file.  Patent licenses, if
     16  * any, provided herein do not apply to combinations of this program with
     17  * other software, or any other product whatsoever.
     18  *
     19  * You should have received a copy of the GNU General Public License along
     20  * with this program; if not, write the Free Software Foundation, Inc.,
     21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
     22  */
     23 
     24 #include <stdio.h>
     25 #include <string.h>
     26 #include <errno.h>
     27 
     28 #include "test.h"
     29 #include "tst_process_state.h"
     30 
     31 void tst_process_state_wait(const char *file, const int lineno,
     32                             void (*cleanup_fn)(void),
     33                             pid_t pid, const char state)
     34 {
     35 	char proc_path[128], cur_state;
     36 
     37 	snprintf(proc_path, sizeof(proc_path), "/proc/%i/stat", pid);
     38 
     39 	for (;;) {
     40 		safe_file_scanf(file, lineno, cleanup_fn, proc_path,
     41 		                "%*i %*s %c", &cur_state);
     42 
     43 		if (state == cur_state)
     44 			return;
     45 
     46 		usleep(10000);
     47 	}
     48 }
     49 
     50 int tst_process_state_wait2(pid_t pid, const char state)
     51 {
     52 	char proc_path[128], cur_state;
     53 
     54 	snprintf(proc_path, sizeof(proc_path), "/proc/%i/stat", pid);
     55 
     56 	for (;;) {
     57 		FILE *f = fopen(proc_path, "r");
     58 		if (!f) {
     59 			fprintf(stderr, "Failed to open '%s': %s\n",
     60 			        proc_path, strerror(errno));
     61 			return 1;
     62 		}
     63 
     64 		if (fscanf(f, "%*i %*s %c", &cur_state) != 1) {
     65 			fclose(f);
     66 			fprintf(stderr, "Failed to read '%s': %s\n",
     67 			        proc_path, strerror(errno));
     68 			return 1;
     69 		}
     70 		fclose(f);
     71 
     72 		if (state == cur_state)
     73 			return 0;
     74 
     75 		usleep(10000);
     76 	}
     77 }
     78