xref: /kvmtool/builtin-list.c (revision 886af5f228d2806978b628b1e98c88b8a5845954)
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>
59dba6721SSasha Levin 
69dba6721SSasha Levin #include <stdio.h>
79dba6721SSasha Levin #include <string.h>
89dba6721SSasha Levin #include <signal.h>
91b1577dcSSasha Levin #include <fcntl.h>
101b1577dcSSasha Levin 
111b1577dcSSasha Levin #define PROCESS_NAME "kvm"
129dba6721SSasha Levin 
13*886af5f2SLiming Wang static int print_guest(const char *name, int pid)
149dba6721SSasha Levin {
151b1577dcSSasha Levin 	char proc_name[PATH_MAX];
16ebc49f06SSasha Levin 	char *comm = NULL;
17ebc49f06SSasha Levin 	FILE *fd;
181b1577dcSSasha Levin 
19ebc49f06SSasha Levin 	sprintf(proc_name, "/proc/%d/stat", pid);
20ebc49f06SSasha Levin 	fd = fopen(proc_name, "r");
21ebc49f06SSasha Levin 	if (fd == NULL)
221b1577dcSSasha Levin 		goto cleanup;
23ebc49f06SSasha Levin 	if (fscanf(fd, "%*u (%as)", &comm) == 0)
241b1577dcSSasha Levin 		goto cleanup;
251b1577dcSSasha Levin 	if (strncmp(comm, PROCESS_NAME, strlen(PROCESS_NAME)))
261b1577dcSSasha Levin 		goto cleanup;
271b1577dcSSasha Levin 
289dba6721SSasha Levin 	printf("%s (PID: %d)\n", name, pid);
291b1577dcSSasha Levin 
30ebc49f06SSasha Levin 	free(comm);
31ebc49f06SSasha Levin 
32ebc49f06SSasha Levin 	fclose(fd);
331a0ef251SSasha Levin 
34*886af5f2SLiming Wang 	return 0;
351b1577dcSSasha Levin 
361b1577dcSSasha Levin cleanup:
37ebc49f06SSasha Levin 	if (fd)
38ebc49f06SSasha Levin 		fclose(fd);
39ebc49f06SSasha Levin 	if (comm)
40ebc49f06SSasha Levin 		free(comm);
41ebc49f06SSasha Levin 
421b1577dcSSasha Levin 	kvm__remove_pidfile(name);
43*886af5f2SLiming Wang 	return 0;
449dba6721SSasha Levin }
459dba6721SSasha Levin 
469dba6721SSasha Levin int kvm_cmd_list(int argc, const char **argv, const char *prefix)
479dba6721SSasha Levin {
48*886af5f2SLiming Wang 	return kvm__enumerate_instances(print_guest);
499dba6721SSasha Levin }
50