Commit a6086377 authored by Bruce Momjian's avatar Bruce Momjian

Another for for exec() removal and finding binaries.

parent cb8539f9
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.85 1998/06/09 04:06:12 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.86 1998/06/09 17:13:03 momjian Exp $
* *
* NOTES * NOTES
* *
...@@ -324,7 +324,7 @@ PostmasterMain(int argc, char *argv[]) ...@@ -324,7 +324,7 @@ PostmasterMain(int argc, char *argv[])
new_argv[i] = ""; new_argv[i] = "";
new_argv[4] = NULL; new_argv[4] = NULL;
if (!Execfile[0] && FindExec(Execfile, argv[0]) < 0) if (!Execfile[0] && FindExec(Execfile, argv[0], "postmaster") < 0)
{ {
fprintf(stderr, "%s: could not find postmaster to execute...\n", fprintf(stderr, "%s: could not find postmaster to execute...\n",
argv[0]); argv[0]);
...@@ -385,7 +385,7 @@ PostmasterMain(int argc, char *argv[]) ...@@ -385,7 +385,7 @@ PostmasterMain(int argc, char *argv[])
break; break;
case 'b': case 'b':
/* Set the backend executable file to use. */ /* Set the backend executable file to use. */
if (!ValidateBackend(optarg)) if (!ValidateBinary(optarg))
strcpy(Execfile, optarg); strcpy(Execfile, optarg);
else else
{ {
...@@ -479,7 +479,7 @@ PostmasterMain(int argc, char *argv[]) ...@@ -479,7 +479,7 @@ PostmasterMain(int argc, char *argv[])
exit(2); exit(2);
} }
if (!Execfile[0] && FindExec(Execfile, argv[0]) < 0) if (!Execfile[0] && FindExec(Execfile, argv[0], "postgres") < 0)
{ {
fprintf(stderr, "%s: could not find backend to execute...\n", fprintf(stderr, "%s: could not find backend to execute...\n",
argv[0]); argv[0]);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.74 1998/06/08 22:28:27 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.75 1998/06/09 17:13:04 momjian Exp $
* *
* NOTES * NOTES
* this is the "main" module of the postgres backend and * this is the "main" module of the postgres backend and
...@@ -1167,7 +1167,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) ...@@ -1167,7 +1167,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
SetCharSet(); SetCharSet();
#endif #endif
if (FindExec(pg_pathname, argv[0]) < 0) if (FindExec(pg_pathname, argv[0], "postgres") < 0)
elog(FATAL, "%s: could not locate executable, bailing out...", elog(FATAL, "%s: could not locate executable, bailing out...",
argv[0]); argv[0]);
...@@ -1314,7 +1314,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) ...@@ -1314,7 +1314,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
if (!IsUnderPostmaster) if (!IsUnderPostmaster)
{ {
puts("\nPOSTGRES backend interactive interface"); puts("\nPOSTGRES backend interactive interface");
puts("$Revision: 1.74 $ $Date: 1998/06/08 22:28:27 $"); puts("$Revision: 1.75 $ $Date: 1998/06/09 17:13:04 $");
} }
/* ---------------- /* ----------------
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/init/Attic/findbe.c,v 1.8 1998/06/08 22:28:28 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/init/Attic/findbe.c,v 1.9 1998/06/09 17:13:05 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -34,14 +34,14 @@ ...@@ -34,14 +34,14 @@
#endif #endif
/* /*
* ValidateBackend -- validate "path" as a POSTGRES executable file * ValidateBinary -- validate "path" as a POSTMASTER/POSTGRES executable file
* *
* returns 0 if the file is found and no error is encountered. * 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. * -1 if the regular file "path" does not exist or cannot be executed.
* -2 if the file is otherwise valid but cannot be read. * -2 if the file is otherwise valid but cannot be read.
*/ */
int int
ValidateBackend(char *path) ValidateBinary(char *path)
{ {
struct stat buf; struct stat buf;
uid_t euid; uid_t euid;
...@@ -61,7 +61,7 @@ ValidateBackend(char *path) ...@@ -61,7 +61,7 @@ ValidateBackend(char *path)
if (strlen(path) >= MAXPGPATH) if (strlen(path) >= MAXPGPATH)
{ {
if (DebugLvl > 1) if (DebugLvl > 1)
fprintf(stderr, "ValidateBackend: pathname \"%s\" is too long\n", fprintf(stderr, "ValidateBinary: pathname \"%s\" is too long\n",
path); path);
return (-1); return (-1);
} }
...@@ -69,14 +69,14 @@ ValidateBackend(char *path) ...@@ -69,14 +69,14 @@ ValidateBackend(char *path)
if (stat(path, &buf) < 0) if (stat(path, &buf) < 0)
{ {
if (DebugLvl > 1) if (DebugLvl > 1)
fprintf(stderr, "ValidateBackend: can't stat \"%s\"\n", fprintf(stderr, "ValidateBinary: can't stat \"%s\"\n",
path); path);
return (-1); return (-1);
} }
if (!(buf.st_mode & S_IFREG)) if (!(buf.st_mode & S_IFREG))
{ {
if (DebugLvl > 1) if (DebugLvl > 1)
fprintf(stderr, "ValidateBackend: \"%s\" is not a regular file\n", fprintf(stderr, "ValidateBinary: \"%s\" is not a regular file\n",
path); path);
return (-1); return (-1);
} }
...@@ -85,7 +85,7 @@ ValidateBackend(char *path) ...@@ -85,7 +85,7 @@ ValidateBackend(char *path)
* Ensure that we are using an authorized backend. * Ensure that we are using an authorized backend.
* *
* XXX I'm open to suggestions here. I would like to enforce ownership * XXX I'm open to suggestions here. I would like to enforce ownership
* of backends by user "postgres" but people seem to like to run as * of binaries by user "postgres" but people seem to like to run as
* users other than "postgres"... * users other than "postgres"...
*/ */
...@@ -102,7 +102,7 @@ ValidateBackend(char *path) ...@@ -102,7 +102,7 @@ ValidateBackend(char *path)
is_r = buf.st_mode & S_IRUSR; is_r = buf.st_mode & S_IRUSR;
is_x = buf.st_mode & S_IXUSR; is_x = buf.st_mode & S_IXUSR;
if (DebugLvl > 1 && !(is_r && is_x)) if (DebugLvl > 1 && !(is_r && is_x))
fprintf(stderr, "ValidateBackend: \"%s\" is not user read/execute\n", fprintf(stderr, "ValidateBinary: \"%s\" is not user read/execute\n",
path); path);
return (is_x ? (is_r ? 0 : -2) : -1); return (is_x ? (is_r ? 0 : -2) : -1);
} }
...@@ -130,7 +130,7 @@ ValidateBackend(char *path) ...@@ -130,7 +130,7 @@ ValidateBackend(char *path)
is_r = buf.st_mode & S_IRGRP; is_r = buf.st_mode & S_IRGRP;
is_x = buf.st_mode & S_IXGRP; is_x = buf.st_mode & S_IXGRP;
if (DebugLvl > 1 && !(is_r && is_x)) if (DebugLvl > 1 && !(is_r && is_x))
fprintf(stderr, "ValidateBackend: \"%s\" is not group read/execute\n", fprintf(stderr, "ValidateBinary: \"%s\" is not group read/execute\n",
path); path);
return (is_x ? (is_r ? 0 : -2) : -1); return (is_x ? (is_r ? 0 : -2) : -1);
} }
...@@ -138,7 +138,7 @@ ValidateBackend(char *path) ...@@ -138,7 +138,7 @@ ValidateBackend(char *path)
is_r = buf.st_mode & S_IROTH; is_r = buf.st_mode & S_IROTH;
is_x = buf.st_mode & S_IXOTH; is_x = buf.st_mode & S_IXOTH;
if (DebugLvl > 1 && !(is_r && is_x)) if (DebugLvl > 1 && !(is_r && is_x))
fprintf(stderr, "ValidateBackend: \"%s\" is not other read/execute\n", fprintf(stderr, "ValidateBinary: \"%s\" is not other read/execute\n",
path); path);
return (is_x ? (is_r ? 0 : -2) : -1); return (is_x ? (is_r ? 0 : -2) : -1);
} }
...@@ -147,11 +147,12 @@ ValidateBackend(char *path) ...@@ -147,11 +147,12 @@ ValidateBackend(char *path)
* FindExec -- find an absolute path to a valid backend executable * 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 * The reason we have to work so hard to find an absolute path is that
* we need to feed the backend server the location of its actual * we need to feed the binary the location of its actual executable file,
* executable file -- otherwise, we can't do dynamic loading. * otherwise, we can't do dynamic loading. It needs a full pathname because
* we change directories to the /data directory.
*/ */
int int
FindExec(char *backend, char *argv0) FindExec(char *full_path, char *argv0, char *binary_name)
{ {
char buf[MAXPGPATH + 2]; char buf[MAXPGPATH + 2];
char *p; char *p;
...@@ -161,7 +162,7 @@ FindExec(char *backend, char *argv0) ...@@ -161,7 +162,7 @@ FindExec(char *backend, char *argv0)
int pathlen; int pathlen;
/* /*
* for the postmaster: First try: use the backend that's located in * for the postmaster: First try: use the binary that's located in
* the same directory as the postmaster, if it was invoked with an * the same directory as the postmaster, if it was invoked with an
* explicit path. Presumably the user used an explicit path because it * explicit path. Presumably the user used an explicit path because it
* wasn't in PATH, and we don't want to use incompatible executables. * wasn't in PATH, and we don't want to use incompatible executables.
...@@ -171,7 +172,7 @@ FindExec(char *backend, char *argv0) ...@@ -171,7 +172,7 @@ FindExec(char *backend, char *argv0)
* trees (obj/post{master,gres}) because they all put the two binaries * trees (obj/post{master,gres}) because they all put the two binaries
* in the same place. * in the same place.
* *
* for the backend server: First try: if we're given some kind of path, * 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 * use it (making sure that a relative path is made absolute before
* returning it). * returning it).
*/ */
...@@ -183,16 +184,16 @@ FindExec(char *backend, char *argv0) ...@@ -183,16 +184,16 @@ FindExec(char *backend, char *argv0)
strcat(buf, "/"); strcat(buf, "/");
strcat(buf, argv0); strcat(buf, argv0);
p = strrchr(buf, '/'); p = strrchr(buf, '/');
strcpy(++p, "postgres"); strcpy(++p, binary_name);
if (!ValidateBackend(buf)) if (!ValidateBinary(buf))
{ {
strncpy(backend, buf, MAXPGPATH); strncpy(full_path, buf, MAXPGPATH);
if (DebugLvl) if (DebugLvl)
fprintf(stderr, "FindExec: found \"%s\" using argv[0]\n", fprintf(stderr, "FindExec: found \"%s\" using argv[0]\n",
backend); full_path);
return (0); return (0);
} }
fprintf(stderr, "FindExec: invalid backend \"%s\"\n", fprintf(stderr, "FindExec: invalid binary \"%s\"\n",
buf); buf);
return (-1); return (-1);
} }
...@@ -219,20 +220,21 @@ FindExec(char *backend, char *argv0) ...@@ -219,20 +220,21 @@ FindExec(char *backend, char *argv0)
if (*startp == '/' || !getcwd(buf, MAXPGPATH)) if (*startp == '/' || !getcwd(buf, MAXPGPATH))
buf[0] = '\0'; buf[0] = '\0';
strcat(buf, startp); strcat(buf, startp);
strcat(buf, "/postgres"); strcat(buf, "/");
switch (ValidateBackend(buf)) strcat(buf, binary_name);
switch (ValidateBinary(buf))
{ {
case 0: /* found ok */ case 0: /* found ok */
strncpy(backend, buf, MAXPGPATH); strncpy(full_path, buf, MAXPGPATH);
if (DebugLvl) if (DebugLvl)
fprintf(stderr, "FindExec: found \"%s\" using PATH\n", fprintf(stderr, "FindExec: found \"%s\" using PATH\n",
backend); full_path);
free(path); free(path);
return (0); return (0);
case -1: /* wasn't even a candidate, keep looking */ case -1: /* wasn't even a candidate, keep looking */
break; break;
case -2: /* found but disqualified */ case -2: /* found but disqualified */
fprintf(stderr, "FindExec: could not read backend \"%s\"\n", fprintf(stderr, "FindExec: could not read binary \"%s\"\n",
buf); buf);
free(path); free(path);
return (-1); return (-1);
...@@ -243,6 +245,6 @@ FindExec(char *backend, char *argv0) ...@@ -243,6 +245,6 @@ FindExec(char *backend, char *argv0)
free(path); free(path);
} }
fprintf(stderr, "FindExec: could not find a backend to execute...\n"); fprintf(stderr, "FindExec: could not find a %s to execute...\n", binary_name);
return (-1); return (-1);
} }
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: miscadmin.h,v 1.25 1998/06/08 22:28:30 momjian Exp $ * $Id: miscadmin.h,v 1.26 1998/06/09 17:13:06 momjian Exp $
* *
* NOTES * NOTES
* some of the information in this file will be moved to * some of the information in this file will be moved to
...@@ -125,8 +125,8 @@ extern char *getpgusername(void); ...@@ -125,8 +125,8 @@ extern char *getpgusername(void);
extern void SetPgUserName(void); extern void SetPgUserName(void);
extern Oid GetUserId(void); extern Oid GetUserId(void);
extern void SetUserId(void); extern void SetUserId(void);
extern int ValidateBackend(char *path); extern int ValidateBinary(char *path);
extern int FindExec(char *backend, char *argv0); extern int FindExec(char *backend, char *argv0, char *binary_name);
extern int CheckPathAccess(char *path, char *name, int open_mode); extern int CheckPathAccess(char *path, char *name, int open_mode);
/* lower case version for case-insensitive SQL referenced in pg_proc.h */ /* lower case version for case-insensitive SQL referenced in pg_proc.h */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment