From ca9540d34f0ad97c5659cac30aab8a016bd9868c Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Sun, 1 Aug 2004 06:19:26 +0000 Subject: [PATCH] Add docs for initdb --auth. --- configure | 5 -- configure.in | 7 +- doc/src/sgml/ref/initdb.sgml | 15 +++- src/Makefile.global.in | 4 +- src/backend/commands/dbcommands.c | 11 +-- src/bin/initdb/Makefile | 7 +- src/bin/initdb/initdb.c | 27 +----- src/include/port.h | 4 +- src/port/dirmod.c | 180 ++++++++++++++++++++++++++++++++++++-- 9 files changed, 201 insertions(+), 59 deletions(-) diff --git a/configure b/configure index f4c9f36c62..066a857a49 100755 --- a/configure +++ b/configure @@ -12063,11 +12063,6 @@ LIBOBJS="$LIBOBJS open.$ac_objext" LIBOBJS="$LIBOBJS rand.$ac_objext" ;; esac -# Win32 can't do rename or unlink on an open file -case $host_os in mingw*|cygwin*) -LIBOBJS="$LIBOBJS dirmod.$ac_objext" ;; -esac - if test "$with_readline" = yes; then echo "$as_me:$LINENO: checking for rl_completion_append_character" >&5 echo $ECHO_N "checking for rl_completion_append_character... $ECHO_C" >&6 diff --git a/configure.in b/configure.in index e11c1a5dba..fb221e6397 100644 --- a/configure.in +++ b/configure.in @@ -1,5 +1,5 @@ dnl Process this file with autoconf to produce a configure script. -dnl $PostgreSQL: pgsql/configure.in,v 1.369 2004/07/20 20:37:13 momjian Exp $ +dnl $PostgreSQL: pgsql/configure.in,v 1.370 2004/08/01 06:19:16 momjian Exp $ dnl dnl Developers, please strive to achieve this order: dnl @@ -911,11 +911,6 @@ AC_LIBOBJ(open) AC_LIBOBJ(rand) ;; esac -# Win32 can't do rename or unlink on an open file -case $host_os in mingw*|cygwin*) -AC_LIBOBJ(dirmod) ;; -esac - if test "$with_readline" = yes; then PGAC_VAR_RL_COMPLETION_APPEND_CHARACTER AC_CHECK_FUNCS([rl_completion_matches rl_filename_completion_function]) diff --git a/doc/src/sgml/ref/initdb.sgml b/doc/src/sgml/ref/initdb.sgml index bc92cedd18..10d65030e4 100644 --- a/doc/src/sgml/ref/initdb.sgml +++ b/doc/src/sgml/ref/initdb.sgml @@ -1,5 +1,5 @@ @@ -99,6 +99,19 @@ PostgreSQL documentation + + + + + This option specifies the authentication method for local users + used in pg_hba.conf. Do not use trust + unless you trust all local users on your system. Trust + is the default for ease of installation. + + + + + diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 7ccf9b00ef..ab2d600174 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -1,5 +1,5 @@ # -*-makefile-*- -# $PostgreSQL: pgsql/src/Makefile.global.in,v 1.190 2004/07/30 12:26:40 petere Exp $ +# $PostgreSQL: pgsql/src/Makefile.global.in,v 1.191 2004/08/01 06:19:19 momjian Exp $ #------------------------------------------------------------------------------ # All PostgreSQL makefiles include this file and use the variables it sets, @@ -347,7 +347,7 @@ endif # # substitute implementations of the C library -LIBOBJS = @LIBOBJS@ exec.o noblock.o path.o pipe.o pgsleep.o pgstrcasecmp.o sprompt.o thread.o +LIBOBJS = @LIBOBJS@ dirmod.o exec.o noblock.o path.o pipe.o pgsleep.o pgstrcasecmp.o sprompt.o thread.o ifneq (,$(LIBOBJS)) LIBS := -lpgport $(LIBS) diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index b9e8c83627..bacf5aa31a 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.137 2004/06/25 21:55:53 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.138 2004/08/01 06:19:22 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -915,7 +915,6 @@ remove_dbtablespaces(Oid db_id) Relation rel; HeapScanDesc scan; HeapTuple tuple; - char buf[MAXPGPATH + 100]; rel = heap_openr(TableSpaceRelationName, AccessShareLock); scan = heap_beginscan(rel, SnapshotNow, 0, NULL); @@ -938,17 +937,11 @@ remove_dbtablespaces(Oid db_id) continue; } -#ifndef WIN32 - snprintf(buf, sizeof(buf), "rm -rf '%s'", dstpath); -#else - snprintf(buf, sizeof(buf), "rmdir /s /q \"%s\"", dstpath); -#endif - if (system(buf) != 0) + if (!rmtree(dstpath, true)) { ereport(WARNING, (errmsg("could not remove database directory \"%s\"", dstpath), - errdetail("Failing system command was: %s", buf), errhint("Look in the postmaster's stderr log for more information."))); } diff --git a/src/bin/initdb/Makefile b/src/bin/initdb/Makefile index 82f3a8ba41..fbfcf9833d 100644 --- a/src/bin/initdb/Makefile +++ b/src/bin/initdb/Makefile @@ -5,7 +5,7 @@ # Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # -# $PostgreSQL: pgsql/src/bin/initdb/Makefile,v 1.41 2004/05/24 01:01:37 momjian Exp $ +# $PostgreSQL: pgsql/src/bin/initdb/Makefile,v 1.42 2004/08/01 06:19:23 momjian Exp $ # #------------------------------------------------------------------------- @@ -15,13 +15,16 @@ include $(top_builddir)/src/Makefile.global override CPPFLAGS := -DFRONTEND -I$(libpq_srcdir) $(CPPFLAGS) -OBJS= initdb.o exec.o +OBJS= initdb.o dirmod.o exec.o all: submake-libpq submake-libpgport initdb initdb: $(OBJS) $(libpq_builddir)/libpq.a $(CC) $(CFLAGS) $(OBJS) $(libpq) $(LDFLAGS) $(LIBS) -o $@$(X) +dirmod.c: % : $(top_srcdir)/src/port/% + rm -f $@ && $(LN_S) $< . + exec.c: % : $(top_srcdir)/src/port/% rm -f $@ && $(LN_S) $< . diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index cd830ecda7..55b782004c 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -39,7 +39,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * Portions taken from FreeBSD. * - * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.45 2004/08/01 05:59:13 momjian Exp $ + * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.46 2004/08/01 06:19:23 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -146,7 +146,6 @@ char backend_exec[MAXPGPATH]; static void *xmalloc(size_t size); static char *xstrdup(const char *s); -static bool rmtree(char *path, bool rmtopdir); static char **replace_token(char **lines, char *token, char *replacement); static char **readfile(char *path); static void writefile(char *path, char **lines); @@ -252,30 +251,6 @@ xstrdup(const char *s) } /* - * delete a directory tree recursively - * assumes path points to a valid directory - * deletes everything under path - * if rmtopdir is true deletes the directory too - */ -static bool -rmtree(char *path, bool rmtopdir) -{ - char buf[MAXPGPATH + 64]; - -#ifndef WIN32 - /* doesn't handle .* files, but we don't make any... */ - snprintf(buf, sizeof(buf), "rm -rf \"%s\"%s", path, - rmtopdir ? "" : "/*"); -#else - snprintf(buf, sizeof(buf), "%s /s /q \"%s\"", - rmtopdir ? "rmdir" : "del", path); -#endif - - return !system(buf); -} - - -/* * make a copy of the array of lines, with token replaced by replacement * the first time it occurs on each line. * diff --git a/src/include/port.h b/src/include/port.h index 9869674a36..ac3634e0ee 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/port.h,v 1.45 2004/07/23 01:58:36 momjian Exp $ + * $PostgreSQL: pgsql/src/include/port.h,v 1.46 2004/08/01 06:19:24 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -148,6 +148,8 @@ extern int pgunlink(const char *path); #define unlink(path) pgunlink(path) #endif +extern bool rmtree(char *path, bool rmtopdir); + #ifdef WIN32 /* open() replacement to allow delete of held files */ diff --git a/src/port/dirmod.c b/src/port/dirmod.c index a0ab8a7a93..912a0c1ca8 100644 --- a/src/port/dirmod.c +++ b/src/port/dirmod.c @@ -10,21 +10,28 @@ * Win32 (NT, Win2k, XP). replace() doesn't work on Win95/98/Me. * * IDENTIFICATION - * $PostgreSQL: pgsql/src/port/dirmod.c,v 1.12 2004/02/26 02:59:26 momjian Exp $ + * $PostgreSQL: pgsql/src/port/dirmod.c,v 1.13 2004/08/01 06:19:26 momjian Exp $ * *------------------------------------------------------------------------- */ -#ifndef TEST_VERSION - -#if defined(WIN32) || defined(__CYGWIN__) - - #ifndef FRONTEND #include "postgres.h" #else #include "postgres_fe.h" #endif + +#include +#include +#include + +#define _(x) gettext((x)) + +#ifndef TEST_VERSION + +#if defined(WIN32) || defined(__CYGWIN__) + + #include "miscadmin.h" #undef rename @@ -82,7 +89,7 @@ pgunlink(const char *path) if (errno != EACCES) /* set errno? */ return -1; - pg_usleep(100000); /* us */ + pg_usleep(100000); /* us */ if (loops == 30) #ifndef FRONTEND elog(LOG, "could not unlink \"%s\", continuing to try", @@ -105,6 +112,165 @@ pgunlink(const char *path) #endif +#if defined(WIN32) || defined(__CYGWIN__) +#define rmt_unlink(path) pgunlink(path) +#else +#define rmt_unlink(path) unlink(path) +#endif + +#ifdef FRONTEND + +static void * +xmalloc(size_t size) +{ + void *result; + + result = malloc(size); + if (!result) + { + fprintf(stderr, _("out of memory\n")); + exit(1); + } + return result; +} + +static char * +xstrdup(const char *s) +{ + char *result; + + result = strdup(s); + if (!result) + { + fprintf(stderr, _("out of memory\n")); + exit(1); + } + return result; +} + +#define xfree(n) free(n) + +#else + +/* on the backend, use palloc and friends */ + +#define xmalloc(n) palloc(n) +#define xstrdup(n) pstrdup(n) +#define xfree(n) pfree(n) + +#endif + +/* + * deallocate memory used for filenames + */ + +static void +rmt_cleanup(char ** filenames) +{ + char ** fn; + + for (fn = filenames; *fn; fn++) + xfree(*fn); + + xfree(filenames); +} + + + +/* + * delete a directory tree recursively + * assumes path points to a valid directory + * deletes everything under path + * if rmtopdir is true deletes the directory too + * + */ + +bool +rmtree(char *path, bool rmtopdir) +{ + char filepath[MAXPGPATH]; + DIR *dir; + struct dirent *file; + char **filenames; + char **filename; + int numnames = 0; + struct stat statbuf; + + /* + * we copy all the names out of the directory before we start + * modifying it. + */ + + dir = opendir(path); + if (dir == NULL) + return false; + + while ((file = readdir(dir)) != NULL) + { + if (strcmp(file->d_name, ".") != 0 && strcmp(file->d_name, "..") != 0) + numnames++; + } + + rewinddir(dir); + + filenames = xmalloc((numnames + 2) * sizeof(char *)); + numnames = 0; + + while ((file = readdir(dir)) != NULL) + { + if (strcmp(file->d_name, ".") != 0 && strcmp(file->d_name, "..") != 0) + filenames[numnames++] = xstrdup(file->d_name); + } + + filenames[numnames] = NULL; + + closedir(dir); + + /* now we have the names we can start removing things */ + + for (filename = filenames; *filename; filename++) + { + snprintf(filepath, MAXPGPATH, "%s/%s", path, *filename); + + if (stat(filepath, &statbuf) != 0) + { + rmt_cleanup(filenames); + return false; + } + + if (S_ISDIR(statbuf.st_mode)) + { + /* call ourselves recursively for a directory */ + if (!rmtree(filepath, true)) + { + rmt_cleanup(filenames); + return false; + } + } + else + { + if (rmt_unlink(filepath) != 0) + { + rmt_cleanup(filenames); + return false; + } + } + } + + if (rmtopdir) + { + if (rmdir(path) != 0) + { + rmt_cleanup(filenames); + return false; + } + } + + rmt_cleanup(filenames); + return true; +} + + #else -- 2.11.0