summaryrefslogtreecommitdiff
path: root/src/backend/utils/init/findbe.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/init/findbe.c')
-rw-r--r--src/backend/utils/init/findbe.c230
1 files changed, 0 insertions, 230 deletions
diff --git a/src/backend/utils/init/findbe.c b/src/backend/utils/init/findbe.c
deleted file mode 100644
index 0337c8f8cd0..00000000000
--- a/src/backend/utils/init/findbe.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * findbe.c
- *
- * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- *
- * IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/init/Attic/findbe.c,v 1.28 2002/06/20 20:29:40 momjian Exp $
- *
- *-------------------------------------------------------------------------
- */
-#include "postgres.h"
-
-#include <sys/types.h>
-#include <grp.h>
-#include <pwd.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#include "miscadmin.h"
-
-#ifndef S_IRUSR /* XXX [TRH] should be in a header */
-#define S_IRUSR S_IREAD
-#define S_IWUSR S_IWRITE
-#define S_IXUSR S_IEXEC
-#define S_IRGRP ((S_IRUSR)>>3)
-#define S_IWGRP ((S_IWUSR)>>3)
-#define S_IXGRP ((S_IXUSR)>>3)
-#define S_IROTH ((S_IRUSR)>>6)
-#define S_IWOTH ((S_IWUSR)>>6)
-#define S_IXOTH ((S_IXUSR)>>6)
-#endif
-
-
-/*
- * ValidateBinary -- validate "path" as a POSTMASTER/POSTGRES executable file
- *
- * returns 0 if the file is found and no error is encountered.
- * -1 if the regular file "path" does not exist or cannot be executed.
- * -2 if the file is otherwise valid but cannot be read.
- */
-static int
-ValidateBinary(char *path)
-{
- struct stat buf;
- uid_t euid;
- struct group *gp;
- struct passwd *pwp;
- int i;
- int is_r = 0;
- int is_x = 0;
- int in_grp = 0;
-
- /*
- * Ensure that the file exists and is a regular file.
- *
- * XXX if you have a broken system where stat() looks at the symlink
- * instead of the underlying file, you lose.
- */
- if (stat(path, &buf) < 0)
- {
- elog(DEBUG2, "ValidateBinary: can't stat \"%s\"", path);
- return -1;
- }
-
- if ((buf.st_mode & S_IFMT) != S_IFREG)
- {
- elog(DEBUG2, "ValidateBinary: \"%s\" is not a regular file", path);
- return -1;
- }
-
- /*
- * Ensure that we are using an authorized backend.
- *
- * XXX I'm open to suggestions here. I would like to enforce ownership
- * of binaries by user "postgres" but people seem to like to run as
- * users other than "postgres"...
- */
-
- /*
- * Ensure that the file is both executable and readable (required for
- * dynamic loading).
- */
- euid = geteuid();
- if (euid == buf.st_uid)
- {
- is_r = buf.st_mode & S_IRUSR;
- is_x = buf.st_mode & S_IXUSR;
- if (!(is_r && is_x))
- elog(DEBUG2, "ValidateBinary: \"%s\" is not user read/execute", path);
- return is_x ? (is_r ? 0 : -2) : -1;
- }
- pwp = getpwuid(euid);
- if (pwp)
- {
- if (pwp->pw_gid == buf.st_gid)
- ++in_grp;
- else if (pwp->pw_name &&
- (gp = getgrgid(buf.st_gid)) != NULL &&
- gp->gr_mem != NULL)
- {
- for (i = 0; gp->gr_mem[i]; ++i)
- {
- if (!strcmp(gp->gr_mem[i], pwp->pw_name))
- {
- ++in_grp;
- break;
- }
- }
- }
- if (in_grp)
- {
- is_r = buf.st_mode & S_IRGRP;
- is_x = buf.st_mode & S_IXGRP;
- if (!(is_r && is_x))
- elog(DEBUG2, "ValidateBinary: \"%s\" is not group read/execute",
- path);
- return is_x ? (is_r ? 0 : -2) : -1;
- }
- }
- is_r = buf.st_mode & S_IROTH;
- is_x = buf.st_mode & S_IXOTH;
- if (!(is_r && is_x))
- elog(DEBUG2, "ValidateBinary: \"%s\" is not other read/execute",
- path);
- return is_x ? (is_r ? 0 : -2) : -1;
-}
-
-/*
- * FindExec -- find an absolute path to a valid backend executable
- *
- * The reason we have to work so hard to find an absolute path is that
- * on some platforms we can't do dynamic loading unless we know the
- * executable's location. Also, we need a full path not a relative
- * path because we will later change working directory.
- */
-int
-FindExec(char *full_path, const char *argv0, const char *binary_name)
-{
- char buf[MAXPGPATH + 2];
- char *p;
- char *path,
- *startp,
- *endp;
-
- /*
- * for the postmaster: First try: use the binary that's located in the
- * same directory as the postmaster, if it was invoked with an
- * explicit path. Presumably the user used an explicit path because it
- * wasn't in PATH, and we don't want to use incompatible executables.
- *
- * This has the neat property that it works for installed binaries, old
- * source trees (obj/support/post{master,gres}) and new marc source
- * trees (obj/post{master,gres}) because they all put the two binaries
- * in the same place.
- *
- * for the binary: First try: if we're given some kind of path, use it
- * (making sure that a relative path is made absolute before returning
- * it).
- */
- if (argv0 && (p = strrchr(argv0, '/')) && *++p)
- {
- if (*argv0 == '/' || !getcwd(buf, MAXPGPATH))
- buf[0] = '\0';
- else
- strcat(buf, "/");
- strcat(buf, argv0);
- p = strrchr(buf, '/');
- strcpy(++p, binary_name);
- if (ValidateBinary(buf) == 0)
- {
- strncpy(full_path, buf, MAXPGPATH);
- elog(DEBUG1, "FindExec: found \"%s\" using argv[0]", full_path);
- return 0;
- }
- fprintf(stderr, "FindExec: invalid binary \"%s\"\n",
- buf);
- return -1;
- }
-
- /*
- * Second try: since no explicit path was supplied, the user must have
- * been relying on PATH. We'll use the same PATH.
- */
- if ((p = getenv("PATH")) && *p)
- {
- elog(DEBUG1, "FindExec: searching PATH ...");
- path = strdup(p); /* make a modifiable copy */
- for (startp = path, endp = strchr(path, ':');
- startp && *startp;
- startp = endp + 1, endp = strchr(startp, ':'))
- {
- if (startp == endp) /* it's a "::" */
- continue;
- if (endp)
- *endp = '\0';
- if (*startp == '/' || !getcwd(buf, MAXPGPATH))
- buf[0] = '\0';
- else
- strcat(buf, "/");
- strcat(buf, startp);
- strcat(buf, "/");
- strcat(buf, binary_name);
- switch (ValidateBinary(buf))
- {
- case 0: /* found ok */
- strncpy(full_path, buf, MAXPGPATH);
- elog(DEBUG1, "FindExec: found \"%s\" using PATH",
- full_path);
- free(path);
- return 0;
- case -1: /* wasn't even a candidate, keep looking */
- break;
- case -2: /* found but disqualified */
- fprintf(stderr, "FindExec: could not read binary \"%s\"\n",
- buf);
- free(path);
- return -1;
- }
- if (!endp) /* last one */
- break;
- }
- free(path);
- }
-
- fprintf(stderr, "FindExec: could not find a %s to execute...\n", binary_name);
- return -1;
-}