xref: /kvmtool/builtin-list.c (revision 0725673ad39930be912cfcb0600eb4d5f9188b14)
19dba6721SSasha Levin #include <kvm/util.h>
29dba6721SSasha Levin #include <kvm/kvm-cmd.h>
32a24f96dSSasha Levin #include <kvm/builtin-list.h>
49dba6721SSasha Levin #include <kvm/kvm.h>
5*0725673aSSasha Levin #include <kvm/parse-options.h>
69dba6721SSasha Levin 
79dba6721SSasha Levin #include <stdio.h>
89dba6721SSasha Levin #include <string.h>
99dba6721SSasha Levin #include <signal.h>
101b1577dcSSasha Levin #include <fcntl.h>
111b1577dcSSasha Levin 
121b1577dcSSasha Levin #define PROCESS_NAME "kvm"
139dba6721SSasha Levin 
14*0725673aSSasha Levin static const char * const list_usage[] = {
15*0725673aSSasha Levin 	"kvm list",
16*0725673aSSasha Levin 	NULL
17*0725673aSSasha Levin };
18*0725673aSSasha Levin 
19*0725673aSSasha Levin static const struct option list_options[] = {
20*0725673aSSasha Levin 	OPT_END()
21*0725673aSSasha Levin };
22*0725673aSSasha Levin 
23*0725673aSSasha Levin void kvm_list_help(void)
24*0725673aSSasha Levin {
25*0725673aSSasha Levin 	usage_with_options(list_usage, list_options);
26*0725673aSSasha Levin }
27*0725673aSSasha Levin 
28886af5f2SLiming Wang static int print_guest(const char *name, int pid)
299dba6721SSasha Levin {
301b1577dcSSasha Levin 	char proc_name[PATH_MAX];
31ebc49f06SSasha Levin 	char *comm = NULL;
32ebc49f06SSasha Levin 	FILE *fd;
331b1577dcSSasha Levin 
34ebc49f06SSasha Levin 	sprintf(proc_name, "/proc/%d/stat", pid);
35ebc49f06SSasha Levin 	fd = fopen(proc_name, "r");
36ebc49f06SSasha Levin 	if (fd == NULL)
371b1577dcSSasha Levin 		goto cleanup;
38ebc49f06SSasha Levin 	if (fscanf(fd, "%*u (%as)", &comm) == 0)
391b1577dcSSasha Levin 		goto cleanup;
401b1577dcSSasha Levin 	if (strncmp(comm, PROCESS_NAME, strlen(PROCESS_NAME)))
411b1577dcSSasha Levin 		goto cleanup;
421b1577dcSSasha Levin 
438a09361dSPekka Enberg 	printf("%5d %s\n", pid, name);
441b1577dcSSasha Levin 
45ebc49f06SSasha Levin 	free(comm);
46ebc49f06SSasha Levin 
47ebc49f06SSasha Levin 	fclose(fd);
481a0ef251SSasha Levin 
49886af5f2SLiming Wang 	return 0;
501b1577dcSSasha Levin 
511b1577dcSSasha Levin cleanup:
52ebc49f06SSasha Levin 	if (fd)
53ebc49f06SSasha Levin 		fclose(fd);
54ebc49f06SSasha Levin 	if (comm)
55ebc49f06SSasha Levin 		free(comm);
56ebc49f06SSasha Levin 
571b1577dcSSasha Levin 	kvm__remove_pidfile(name);
58886af5f2SLiming Wang 	return 0;
599dba6721SSasha Levin }
609dba6721SSasha Levin 
619dba6721SSasha Levin int kvm_cmd_list(int argc, const char **argv, const char *prefix)
629dba6721SSasha Levin {
638a09361dSPekka Enberg 	printf("  PID GUEST\n");
648a09361dSPekka Enberg 
65886af5f2SLiming Wang 	return kvm__enumerate_instances(print_guest);
669dba6721SSasha Levin }
67