[PATCH v4] add util/search-path.{c, h} to test for executables in $PATH
authorDaniel Kahn Gillmor <dkg@fifthhorseman.net>
Tue, 9 Feb 2016 21:52:05 +0000 (16:52 +1900)
committerW. Trevor King <wking@tremily.us>
Sat, 20 Aug 2016 23:21:03 +0000 (16:21 -0700)
46/2ddf8ada2e655ceaefa0c03655d25e14e78ff1 [new file with mode: 0644]

diff --git a/46/2ddf8ada2e655ceaefa0c03655d25e14e78ff1 b/46/2ddf8ada2e655ceaefa0c03655d25e14e78ff1
new file mode 100644 (file)
index 0000000..601df0a
--- /dev/null
@@ -0,0 +1,159 @@
+Return-Path: <dkg@fifthhorseman.net>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+ by arlo.cworth.org (Postfix) with ESMTP id 3150A6DE0275\r
+ for <notmuch@notmuchmail.org>; Tue,  9 Feb 2016 13:52:09 -0800 (PST)\r
+X-Virus-Scanned: Debian amavisd-new at cworth.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: -0.02\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=-0.02 tagged_above=-999 required=5 tests=[AWL=-0.020]\r
+ autolearn=disabled\r
+Received: from arlo.cworth.org ([127.0.0.1])\r
+ by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024)\r
+ with ESMTP id N28myWbFAXH5 for <notmuch@notmuchmail.org>;\r
+ Tue,  9 Feb 2016 13:52:07 -0800 (PST)\r
+Received: from che.mayfirst.org (che.mayfirst.org [209.234.253.108])\r
+ by arlo.cworth.org (Postfix) with ESMTP id 11C5A6DE0231\r
+ for <notmuch@notmuchmail.org>; Tue,  9 Feb 2016 13:52:06 -0800 (PST)\r
+Received: from fifthhorseman.net (unknown [38.109.115.130])\r
+ by che.mayfirst.org (Postfix) with ESMTPSA id 229E2F991\r
+ for <notmuch@notmuchmail.org>; Tue,  9 Feb 2016 16:52:03 -0500 (EST)\r
+Received: by fifthhorseman.net (Postfix, from userid 1000)\r
+ id 9DA0B2017F; Tue,  9 Feb 2016 16:52:05 -0500 (EST)\r
+From: Daniel Kahn Gillmor <dkg@fifthhorseman.net>\r
+To: Notmuch Mail <notmuch@notmuchmail.org>\r
+Subject: [PATCH v4] add util/search-path.{c,\r
+ h} to test for executables in $PATH\r
+Date: Tue,  9 Feb 2016 16:52:05 -0500\r
+Message-Id: <1455054725-952-1-git-send-email-dkg@fifthhorseman.net>\r
+X-Mailer: git-send-email 2.7.0\r
+In-Reply-To: <87oabqvy6s.fsf@maritornes.cs.unb.ca>\r
+References: <87oabqvy6s.fsf@maritornes.cs.unb.ca>\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.20\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+ <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <https://notmuchmail.org/mailman/options/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch/>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <https://notmuchmail.org/mailman/listinfo/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Tue, 09 Feb 2016 21:52:09 -0000\r
+\r
+This is a utility function we can use to see whether an executable is\r
+available.\r
+---\r
+ util/Makefile.local |  2 +-\r
+ util/search-path.c  | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++\r
+ util/search-path.h  | 24 ++++++++++++++++++++++++\r
+ 3 files changed, 75 insertions(+), 1 deletion(-)\r
+ create mode 100644 util/search-path.c\r
+ create mode 100644 util/search-path.h\r
+\r
+diff --git a/util/Makefile.local b/util/Makefile.local\r
+index 905f237..8b2b91b 100644\r
+--- a/util/Makefile.local\r
++++ b/util/Makefile.local\r
+@@ -5,7 +5,7 @@ extra_cflags += -I$(srcdir)/$(dir)\r
\r
+ libutil_c_srcs := $(dir)/xutil.c $(dir)/error_util.c $(dir)/hex-escape.c \\r
+                 $(dir)/string-util.c $(dir)/talloc-extra.c $(dir)/zlib-extra.c \\r
+-              $(dir)/util.c\r
++              $(dir)/util.c $(dir)/search-path.c\r
\r
+ libutil_modules := $(libutil_c_srcs:.c=.o)\r
\r
+diff --git a/util/search-path.c b/util/search-path.c\r
+new file mode 100644\r
+index 0000000..9da21cb\r
+--- /dev/null\r
++++ b/util/search-path.c\r
+@@ -0,0 +1,50 @@\r
++#include "search-path.h"\r
++#include <stdlib.h>\r
++#include <unistd.h>\r
++#include <string.h>\r
++#include <sys/types.h>\r
++#include <sys/stat.h>\r
++#include <fcntl.h>\r
++\r
++\r
++notmuch_bool_t\r
++test_for_executable (const char *exename)\r
++{\r
++    char *path = NULL, *save = NULL, *tok;\r
++    notmuch_bool_t ret = FALSE;\r
++\r
++    if (strchr (exename, '/')) {\r
++      if (0 == access (exename, X_OK))\r
++          return TRUE;\r
++      else\r
++          return FALSE;\r
++    }\r
++\r
++    path = getenv ("PATH");\r
++    if (path)\r
++      path = strdup (path);\r
++    else {\r
++      size_t n = confstr (_CS_PATH, NULL, 0);\r
++      path = (char *) malloc (n);\r
++      if (! path)\r
++          return FALSE;\r
++      confstr (_CS_PATH, path, n);\r
++    }\r
++\r
++    tok = strtok_r (path, ":", &save);\r
++    while (tok) {\r
++      int dir_fd = open (tok, O_DIRECTORY | O_RDONLY);\r
++      if (dir_fd != -1) {\r
++          int access = faccessat (dir_fd, exename, X_OK, 0);\r
++          close (dir_fd);\r
++          if (access == 0) {\r
++              ret = TRUE;\r
++              break;\r
++          }\r
++      }\r
++      tok = strtok_r (NULL, ":", &save);\r
++    }\r
++    if (path)\r
++      free (path);\r
++    return ret;\r
++}\r
+diff --git a/util/search-path.h b/util/search-path.h\r
+new file mode 100644\r
+index 0000000..14c4d14\r
+--- /dev/null\r
++++ b/util/search-path.h\r
+@@ -0,0 +1,24 @@\r
++#ifndef _SEARCH_PATH_H\r
++#define _SEARCH_PATH_H\r
++\r
++#include "notmuch.h"\r
++\r
++/* can an executable be found with the given name?\r
++ *\r
++ * Return TRUE only if we can find something to execute with the\r
++ * associated name.\r
++ *\r
++ * if the name has a '/' in it, we look for it directly with\r
++ * access(exename, X_OK).\r
++ *\r
++ * otherwise, we look for it in $PATH (or in confstr(_CS_PATH), if\r
++ * $PATH is unset).\r
++ *\r
++ * This should match the logic for execvp (as well as matching user\r
++ * expectations, hopefully).\r
++ */\r
++\r
++notmuch_bool_t\r
++test_for_executable (const char *exename);\r
++\r
++#endif\r
+-- \r
+2.7.0\r
+\r