public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Mike Frysinger" <vapier@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/pax-utils:master commit in: /
Date: Mon, 20 Jun 2016 03:08:21 +0000 (UTC)	[thread overview]
Message-ID: <1466383024.56905522dfd178685b6225c6be89560cb02c445c.vapier@gentoo> (raw)

commit:     56905522dfd178685b6225c6be89560cb02c445c
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Mon Jun 20 00:37:04 2016 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Mon Jun 20 00:37:04 2016 +0000
URL:        https://gitweb.gentoo.org/proj/pax-utils.git/commit/?id=56905522

pspax: rewrite core loop to use *at funcs

This makes the code a bit simpler & robust.

 pspax.c | 228 ++++++++++++++++++++++++++++++++++++----------------------------
 1 file changed, 128 insertions(+), 100 deletions(-)

diff --git a/pspax.c b/pspax.c
index c64472c..67b7678 100644
--- a/pspax.c
+++ b/pspax.c
@@ -40,20 +40,47 @@ static pid_t show_pid = 0;
 static uid_t show_uid = (uid_t)-1;
 static gid_t show_gid = (gid_t)-1;
 
-static FILE *proc_fopen(pid_t pid, const char *file)
+static int proc_open(int pfd, const char *file)
 {
-	char path[__PAX_UTILS_PATH_MAX];
-	snprintf(path, sizeof(path), PROC_DIR "/%u/%s", pid, file);
-	path[sizeof(path) - 1] = '\0';
-	return fopen(path, "r");
+	return openat(pfd, file, O_RDONLY|O_CLOEXEC);
 }
 
-static char *get_proc_name_cmdline(pid_t pid)
+static FILE *proc_fopen(int pfd, const char *file)
+{
+	int fd;
+	FILE *fp;
+
+	fd = proc_open(pfd, file);
+	if (fd == -1)
+		return NULL;
+
+	fp = fdopen(fd, "re");
+	if (fp == NULL)
+		close(fd);
+
+	return fp;
+}
+
+static elfobj *proc_readelf(int pfd)
+{
+	int fd;
+	elfobj *elf;
+
+	fd = proc_open(pfd, "exe");
+	if (fd == -1)
+		return NULL;
+
+	elf = readelf_fd("proc/exe", fd, 0);
+	close(fd);
+	return elf;
+}
+
+static char *get_proc_name_cmdline(int pfd)
 {
 	FILE *fp;
 	static char str[1024];
 
-	fp = proc_fopen(pid, "cmdline");
+	fp = proc_fopen(pfd, "cmdline");
 	if (fp == NULL)
 		return NULL;
 
@@ -64,15 +91,15 @@ static char *get_proc_name_cmdline(pid_t pid)
 	return (str);
 }
 
-static char *get_proc_name(pid_t pid)
+static char *get_proc_name(int pfd)
 {
 	FILE *fp;
 	static char str[BUFSIZ];
 
 	if (wide_output)
-		return get_proc_name_cmdline(pid);
+		return get_proc_name_cmdline(pfd);
 
-	fp = proc_fopen(pid, "stat");
+	fp = proc_fopen(pfd, "stat");
 	if (fp == NULL)
 		return NULL;
 
@@ -90,12 +117,12 @@ static char *get_proc_name(pid_t pid)
 	return (str+1);
 }
 
-static int get_proc_maps(pid_t pid)
+static int get_proc_maps(int pfd)
 {
 	FILE *fp;
 	static char str[BUFSIZ];
 
-	if ((fp = proc_fopen(pid, "maps")) == NULL)
+	if ((fp = proc_fopen(pfd, "maps")) == NULL)
 		return -1;
 
 	while (fgets(str, sizeof(str), fp)) {
@@ -126,12 +153,12 @@ static int get_proc_maps(pid_t pid)
 	return 0;
 }
 
-static int print_executable_mappings(pid_t pid)
+static int print_executable_mappings(int pfd)
 {
 	FILE *fp;
 	static char str[BUFSIZ];
 
-	if ((fp = proc_fopen(pid, "maps")) == NULL)
+	if ((fp = proc_fopen(pfd, "maps")) == NULL)
 		return -1;
 
 	while (fgets(str, sizeof(str), fp)) {
@@ -169,28 +196,24 @@ static int print_executable_mappings(pid_t pid)
 # define NOTE_TO_SELF
 #endif
 
-static struct passwd *get_proc_passwd(pid_t pid)
+static struct passwd *get_proc_passwd(int pfd)
 {
 	struct stat st;
-	struct passwd *pwd;
-	char path[__PAX_UTILS_PATH_MAX];
-
-	snprintf(path, sizeof(path), PROC_DIR "/%u/stat", pid);
+	struct passwd *pwd = NULL;
 
-	if (stat(path, &st) != -1)
-		if ((pwd = getpwuid(st.st_uid)) != NULL)
-			return pwd;
+	if (fstatat(pfd, "stat", &st, AT_SYMLINK_NOFOLLOW) != -1)
+		pwd = getpwuid(st.st_uid);
 
-	return NULL;
+	return pwd;
 }
 
-static char *get_proc_status(pid_t pid, const char *name)
+static char *get_proc_status(int pfd, const char *name)
 {
 	FILE *fp;
 	size_t len;
 	static char str[BUFSIZ];
 
-	if ((fp = proc_fopen(pid, "status")) == NULL)
+	if ((fp = proc_fopen(pfd, "status")) == NULL)
 		return NULL;
 
 	len = strlen(name);
@@ -208,13 +231,13 @@ static char *get_proc_status(pid_t pid, const char *name)
 	return NULL;
 }
 
-static char *get_pid_attr(pid_t pid)
+static char *get_pid_attr(int pfd)
 {
 	FILE *fp;
 	char *p;
 	static char buf[BUFSIZ];
 
-	if ((fp = proc_fopen(pid, "attr/current")) == NULL)
+	if ((fp = proc_fopen(pfd, "attr/current")) == NULL)
 		return NULL;
 
 	if (fgets(buf, sizeof(buf), fp) != NULL)
@@ -225,13 +248,13 @@ static char *get_pid_attr(pid_t pid)
 	return buf;
 }
 
-static char *get_pid_addr(pid_t pid)
+static char *get_pid_addr(int pfd)
 {
 	FILE *fp;
 	char *p;
 	static char buf[BUFSIZ];
 
-	if ((fp = proc_fopen(pid, "ipaddr")) == NULL)
+	if ((fp = proc_fopen(pfd, "ipaddr")) == NULL)
 		return NULL;
 
 	if (fgets(buf, sizeof(buf), fp) != NULL)
@@ -242,15 +265,15 @@ static char *get_pid_addr(pid_t pid)
 	return buf;
 }
 
-static const char *get_proc_type(pid_t pid)
+static const char *get_proc_type(int pfd)
 {
-	char fname[32];
 	elfobj *elf;
 	const char *ret;
 
-	snprintf(fname, sizeof(fname), PROC_DIR "/%u/exe", pid);
-	if ((elf = readelf(fname)) == NULL)
+	elf = proc_readelf(pfd);
+	if (elf == NULL)
 		return NULL;
+
 	ret = get_elfetype(elf);
 	unreadelf(elf);
 	return ret;
@@ -290,15 +313,15 @@ static char *scanelf_file_phdr(elfobj *elf)
 	return ret;
 }
 /* we scan the elf file two times when the -e flag is given. But we don't need -e very often so big deal */
-static const char *get_proc_phdr(pid_t pid)
+static const char *get_proc_phdr(int pfd)
 {
-	char fname[32];
 	elfobj *elf;
 	const char *ret;
 
-	snprintf(fname, sizeof(fname), PROC_DIR "/%u/exe", pid);
-	if ((elf = readelf(fname)) == NULL)
+	elf = proc_readelf(pfd);
+	if (elf == NULL)
 		return NULL;
+
 	ret = scanelf_file_phdr(elf);
 	unreadelf(elf);
 	return ret;
@@ -312,9 +335,9 @@ static void pspax(const char *find_name)
 	pid_t ppid = show_pid;
 	int have_attr, have_addr, wx;
 	struct passwd *pwd;
-	struct stat st;
 	const char *pax, *type, *name, *attr, *addr;
 	char *caps;
+	int pfd;
 	WRAP_SYSCAP(ssize_t length; cap_t cap_d;)
 
 	WRAP_SYSCAP(cap_d = cap_init());
@@ -339,76 +362,81 @@ static void pspax(const char *find_name)
 			have_addr ? "IPADDR" : "", show_phdr ? "STACK LOAD" : "");
 
 	while ((de = readdir(dir))) {
-		errno = 0;
-		stat(de->d_name, &st);
-		if ((errno != ENOENT) && (errno != EACCES)) {
-			pid = (pid_t) atoi((char *) basename((char *) de->d_name));
-			if (find_name && pid) {
-				char *str = get_proc_name(pid);
-				if (!str)
-					continue;
-				if (strcmp(str, find_name) != 0)
-					pid = 0;
-			}
-			if (((ppid > 0) && (pid != ppid)) || !pid)
-				continue;
+		/* Check the name first if it's an int as it's faster. */
+		pid = atoi(de->d_name);
+		if (pid == 0)
+			continue;
 
-			wx = get_proc_maps(pid);
+		/* Get an open handle so the kernel won't reap on us later. */
+		pfd = open(de->d_name, O_RDONLY|O_CLOEXEC|O_PATH|O_DIRECTORY);
+		if (pfd == -1)
+			continue;
 
-			if (noexec != writeexec) {
-				if ((wx == 1) && (writeexec != wx))
-					goto next_pid;
+		if (find_name && pid) {
+			char *str = get_proc_name(pfd);
+			if (!str)
+				goto next_pid;
+			if (strcmp(str, find_name) != 0)
+				pid = 0;
+		}
+		if (ppid > 0 && pid != ppid)
+			goto next_pid;
 
-				if ((wx == 0) && writeexec)
-					goto next_pid;
-			}
+		wx = get_proc_maps(pfd);
 
-			pwd  = get_proc_passwd(pid);
-			pax  = get_proc_status(pid, "PAX");
-			type = get_proc_type(pid);
-			name = get_proc_name(pid);
-			attr = (have_attr ? get_pid_attr(pid) : NULL);
-			addr = (have_addr ? get_pid_addr(pid) : NULL);
-
-			if (pwd) {
-				if (show_uid != (uid_t)-1)
-					if (pwd->pw_uid != show_uid)
-						continue;
-
-				if (show_gid != (gid_t)-1)
-					if (pwd->pw_gid != show_gid)
-						continue;
-			}
+		if (noexec != writeexec) {
+			if (wx == 1 && writeexec != wx)
+				goto next_pid;
 
-			/* this is a non-POSIX function */
-			caps = NULL;
-			WRAP_SYSCAP(capgetp(pid, cap_d));
-			WRAP_SYSCAP(caps = cap_to_text(cap_d, &length));
-
-			if (pwd && strlen(pwd->pw_name) >= 8)
-				pwd->pw_name[8] = 0;
-
-			if (show_all || type) {
-				printf("%-8s %-6d %-6s %-4s %-10s %-16s %-4s %s %s %s\n",
-				       pwd  ? pwd->pw_name : "--------",
-				       pid,
-				       pax  ? pax  : "---",
-				       (wx == 1) ? "w|x" : (wx == -1) ? "---" : "w^x",
-				       type ? type : "-------",
-				       name ? name : "-----",
-				       caps ? caps : " = ",
-				       attr ? attr : "",
-				       addr ? addr : "",
-				       show_phdr ? get_proc_phdr(pid) : "");
-				if (verbose && wx)
-					print_executable_mappings(pid);
-			}
+			if (wx == 0 && writeexec)
+				goto next_pid;
+		}
 
-			WRAP_SYSCAP(if (caps) cap_free(caps));
+		pwd  = get_proc_passwd(pfd);
+		pax  = get_proc_status(pfd, "PAX");
+		type = get_proc_type(pfd);
+		name = get_proc_name(pfd);
+		attr = (have_attr ? get_pid_attr(pfd) : NULL);
+		addr = (have_addr ? get_pid_addr(pfd) : NULL);
 
-		next_pid:
-			continue;
+		if (pwd) {
+			if (show_uid != (uid_t)-1)
+				if (pwd->pw_uid != show_uid)
+					goto next_pid;
+
+			if (show_gid != (gid_t)-1)
+				if (pwd->pw_gid != show_gid)
+					goto next_pid;
+		}
+
+		/* this is a non-POSIX function */
+		caps = NULL;
+		WRAP_SYSCAP(capgetp(pfd, cap_d));
+		WRAP_SYSCAP(caps = cap_to_text(cap_d, &length));
+
+		if (pwd && strlen(pwd->pw_name) >= 8)
+			pwd->pw_name[8] = 0;
+
+		if (show_all || type) {
+			printf("%-8s %-6d %-6s %-4s %-10s %-16s %-4s %s %s %s\n",
+			       pwd  ? pwd->pw_name : "--------",
+			       pid,
+			       pax  ? pax  : "---",
+			       (wx == 1) ? "w|x" : (wx == -1) ? "---" : "w^x",
+			       type ? type : "-------",
+			       name ? name : "-----",
+			       caps ? caps : " = ",
+			       attr ? attr : "",
+			       addr ? addr : "",
+			       show_phdr ? get_proc_phdr(pfd) : "");
+			if (verbose && wx)
+				print_executable_mappings(pfd);
 		}
+
+		WRAP_SYSCAP(if (caps) cap_free(caps));
+
+ next_pid:
+		close(pfd);
 	}
 	closedir(dir);
 }


             reply	other threads:[~2016-06-20  3:08 UTC|newest]

Thread overview: 253+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-20  3:08 Mike Frysinger [this message]
  -- strict thread matches above, loose matches on Subject: below --
2024-09-22  4:33 [gentoo-commits] proj/pax-utils:master commit in: / Sam James
2024-09-22  4:30 Sam James
2024-08-09 10:06 Sam James
2024-08-09 10:06 Sam James
2024-08-09 10:06 Sam James
2024-08-09 10:06 Sam James
2024-08-09 10:06 Sam James
2024-08-09 10:06 Sam James
2024-08-09 10:02 Sam James
2024-07-22 21:07 Mike Gilbert
2024-07-22 20:08 Mike Gilbert
2024-01-25  6:52 Mike Frysinger
2024-01-25  5:57 Mike Frysinger
2024-01-25  5:57 Mike Frysinger
2024-01-25  5:36 Mike Frysinger
2024-01-25  5:21 Mike Frysinger
2024-01-25  5:06 Mike Frysinger
2024-01-25  5:06 Mike Frysinger
2024-01-25  4:44 Mike Frysinger
2024-01-25  2:53 Mike Frysinger
2024-01-25  2:53 Mike Frysinger
2024-01-25  2:53 Mike Frysinger
2024-01-25  2:14 Mike Frysinger
2024-01-24 22:53 Mike Frysinger
2024-01-24 22:15 Mike Frysinger
2024-01-24 15:44 Mike Frysinger
2024-01-16  5:13 Mike Frysinger
2024-01-16  5:13 Mike Frysinger
2024-01-10  8:05 Mike Frysinger
2024-01-10  8:02 Mike Frysinger
2024-01-10  8:02 Mike Frysinger
2024-01-10  7:58 Mike Frysinger
2024-01-02 18:03 Mike Frysinger
2024-01-02 18:03 Mike Frysinger
2024-01-02 18:03 Mike Frysinger
2024-01-02 18:03 Mike Frysinger
2024-01-02 16:28 Mike Frysinger
2024-01-01 15:43 Mike Frysinger
2024-01-01 15:43 Mike Frysinger
2023-12-22  5:31 Mike Frysinger
2023-12-22  5:31 Mike Frysinger
2023-12-22  5:31 Mike Frysinger
2023-12-22  2:31 Mike Frysinger
2023-12-22  2:31 Mike Frysinger
2023-12-22  2:31 Mike Frysinger
2023-12-14 21:28 Mike Frysinger
2023-12-14 21:28 Mike Frysinger
2023-12-14 19:57 Mike Frysinger
2023-11-23 13:31 Sam James
2023-02-13  5:26 Sam James
2023-02-13  5:26 Sam James
2023-01-29  5:56 Sam James
2023-01-29  5:56 Sam James
2023-01-29  5:56 Sam James
2023-01-29  3:41 Sam James
2023-01-29  3:36 Sam James
2023-01-29  3:36 Sam James
2023-01-26 21:46 Sam James
2023-01-06  7:15 Sam James
2022-09-28  7:42 Mike Frysinger
2022-09-28  7:42 Mike Frysinger
2022-09-28  7:42 Mike Frysinger
2022-09-28  7:42 Mike Frysinger
2022-09-28  7:42 Mike Frysinger
2022-09-28  7:42 Mike Frysinger
2022-09-28  7:42 Mike Frysinger
2022-09-21  8:28 Mike Frysinger
2022-09-21  8:26 Mike Frysinger
2022-09-21  8:20 Mike Frysinger
2022-07-31  4:56 Sam James
2022-07-12  6:33 Sam James
2022-07-12  6:33 Sam James
2022-04-25  1:20 WANG Xuerui
2022-03-24 15:42 Sam James
2022-03-09  8:01 Mike Frysinger
2022-02-07  7:18 Fabian Groffen
2022-01-23  2:47 Mike Frysinger
2021-12-24  1:45 Sam James
2021-12-17  5:19 Mike Frysinger
2021-10-17  5:15 Mike Frysinger
2021-10-05  1:05 Mike Frysinger
2021-10-04 22:05 Mike Frysinger
2021-09-20  4:51 Sam James
2021-07-22 21:31 Sergei Trofimovich
2021-07-22 21:16 Sergei Trofimovich
2021-07-02 22:04 Sergei Trofimovich
2021-06-10  7:07 Sergei Trofimovich
2021-06-10  7:02 Sergei Trofimovich
2021-04-19  4:58 Mike Frysinger
2021-04-18 18:29 Mike Frysinger
2021-04-17  5:39 Mike Frysinger
2021-04-17  5:39 Mike Frysinger
2021-04-17  0:38 Mike Frysinger
2021-04-16 19:26 Mike Frysinger
2021-04-16 19:26 Mike Frysinger
2021-04-16 19:26 Mike Frysinger
2021-04-16 19:03 Mike Frysinger
2021-04-16 19:03 Mike Frysinger
2021-04-16 15:08 Mike Frysinger
2021-04-16 15:08 Mike Frysinger
2021-04-16 15:08 Mike Frysinger
2021-04-16  3:41 Mike Frysinger
2021-04-16  3:39 Mike Frysinger
2021-04-16  3:39 Mike Frysinger
2021-04-16  1:56 Mike Frysinger
2021-04-16  1:56 Mike Frysinger
2021-04-16  0:48 Mike Frysinger
2021-04-16  0:48 Mike Frysinger
2021-02-26 11:51 Sergei Trofimovich
2021-02-04 18:51 Sergei Trofimovich
2021-02-03 20:41 Sergei Trofimovich
2021-02-03 20:17 Sergei Trofimovich
2021-02-03 19:46 Sergei Trofimovich
2021-01-01 14:08 Fabian Groffen
2021-01-01 14:08 Fabian Groffen
2020-12-20 19:53 Sergei Trofimovich
2020-10-05 17:46 Sergei Trofimovich
2020-08-14 22:17 Sergei Trofimovich
2020-04-13 10:41 Sergei Trofimovich
2020-04-06 18:00 Sergei Trofimovich
2020-03-26 19:27 Mike Frysinger
2020-03-26 17:09 Mike Frysinger
2020-03-26 17:09 Mike Frysinger
2020-03-19  0:00 Sergei Trofimovich
2020-03-18 23:39 Sergei Trofimovich
2020-02-16 10:57 Sergei Trofimovich
2020-02-16 10:50 Sergei Trofimovich
2020-02-16 10:48 Sergei Trofimovich
2020-02-16 10:17 Sergei Trofimovich
2019-01-14 22:53 Sergei Trofimovich
2018-11-19 22:20 Sergei Trofimovich
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07 14:09 Mike Frysinger
2018-06-07  4:44 Mike Frysinger
2018-06-07  4:44 Mike Frysinger
2018-06-07  4:44 Mike Frysinger
2018-02-24 10:16 Sergei Trofimovich
2017-09-18  9:27 Fabian Groffen
2017-09-18  9:27 Fabian Groffen
2017-09-18  7:06 Fabian Groffen
2017-03-14  7:19 Mike Frysinger
2017-02-16 21:24 Mike Frysinger
2017-02-16 21:24 Mike Frysinger
2017-02-16 21:24 Mike Frysinger
2017-02-11  7:06 Mike Frysinger
2017-02-01 23:08 Mike Frysinger
2017-02-01 23:08 Mike Frysinger
2017-02-01 23:08 Mike Frysinger
2017-01-24 20:39 Mike Frysinger
2017-01-24 20:39 Mike Frysinger
2017-01-24  6:50 Mike Frysinger
2017-01-24  6:50 Mike Frysinger
2017-01-24  6:50 Mike Frysinger
2017-01-24  6:50 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2017-01-22 17:59 Mike Frysinger
2016-11-27  3:43 Mike Frysinger
2016-11-15  4:02 Mike Frysinger
2016-11-15  4:02 Mike Frysinger
2016-11-14 14:57 Mike Frysinger
2016-11-12  7:15 Mike Frysinger
2016-11-12  7:15 Mike Frysinger
2016-11-12  7:15 Mike Frysinger
2016-11-12  7:15 Mike Frysinger
2016-11-12  7:15 Mike Frysinger
2016-11-12  7:15 Mike Frysinger
2016-11-08 20:47 Mike Gilbert
2016-06-20 17:46 Mike Frysinger
2016-06-20  4:03 Mike Frysinger
2016-06-20  4:03 Mike Frysinger
2016-06-20  3:22 Mike Frysinger
2016-06-20  3:22 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-06-20  3:08 Mike Frysinger
2016-05-31 22:27 Mike Frysinger
2016-03-03 21:15 Mike Frysinger
2016-02-10 19:41 Mike Frysinger
2016-02-10 18:54 Mike Frysinger
2016-01-28 22:42 Mike Frysinger
2016-01-03 22:23 Mike Frysinger
2016-01-03 22:23 Mike Frysinger
2016-01-03 22:01 Mike Frysinger
2016-01-02 15:26 Mike Frysinger
2016-01-02  3:52 Mike Frysinger
2015-12-19 19:41 Mike Frysinger
2015-12-17  3:24 Mike Frysinger
2015-12-17  3:24 Mike Frysinger
2015-12-17  3:24 Mike Frysinger
2015-12-17  3:24 Mike Frysinger
2015-12-12 22:45 Mike Frysinger
2015-12-12 22:45 Mike Frysinger
2015-12-12 22:45 Mike Frysinger
2015-12-12 22:45 Mike Frysinger
2015-12-12 22:45 Mike Frysinger
2015-12-12 22:45 Mike Frysinger
2015-11-26  8:43 Mike Frysinger
2015-10-26  4:35 Mike Frysinger
2015-10-08 20:31 Mike Frysinger
2015-09-19  6:27 Mike Frysinger
2015-09-19  6:27 Mike Frysinger
2015-09-12  4:17 Mike Frysinger
2015-08-28  0:33 Mike Frysinger
2015-08-26  6:29 Mike Frysinger
2015-08-24 21:22 Mike Frysinger
2015-08-24 21:22 Mike Frysinger
2015-08-24 21:22 Mike Frysinger
2015-08-20 14:39 Mike Frysinger
2015-08-20 14:39 Mike Frysinger
2015-08-20 14:39 Mike Frysinger
2015-08-20 14:33 Mike Frysinger
2015-08-20 14:33 Mike Frysinger
2015-08-20 13:32 Mike Frysinger
2015-08-18 15:56 Mike Frysinger
2015-08-18 15:35 Mike Frysinger
2015-08-18 15:35 Mike Frysinger
2015-08-18 14:39 Mike Frysinger
2015-08-18 14:38 Mike Frysinger
2015-07-13  9:14 Mike Frysinger
2015-07-13  9:14 Mike Frysinger
2015-07-13  9:14 Mike Frysinger
2015-05-24  3:22 Mike Frysinger
2015-03-29 20:07 Mike Frysinger
2015-03-29 20:07 Mike Frysinger
2015-03-29 20:07 Mike Frysinger
2015-03-10  5:31 Mike Frysinger
2015-03-10  5:31 Mike Frysinger
2015-03-10  4:19 Mike Frysinger
2015-03-10  3:36 Mike Frysinger
2015-03-06 11:52 Mike Frysinger
2015-03-04 22:35 Mike Frysinger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1466383024.56905522dfd178685b6225c6be89560cb02c445c.vapier@gentoo \
    --to=vapier@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox