From 7e16f3c0d8831c25c3f95b77c7ad471f18a005eb Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 8 Nov 2001 04:24:03 +0000 Subject: [PATCH] PostgreSQL works again on Mac OS X 10.1. Hold your nose before investigating the kluge that makes it so... --- src/backend/port/darwin/Makefile | 4 +- src/backend/port/darwin/README | 38 ++++++++++++++++ src/backend/port/darwin/system.c | 96 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 src/backend/port/darwin/README create mode 100644 src/backend/port/darwin/system.c diff --git a/src/backend/port/darwin/Makefile b/src/backend/port/darwin/Makefile index 6696529e51..898fb627e3 100644 --- a/src/backend/port/darwin/Makefile +++ b/src/backend/port/darwin/Makefile @@ -4,7 +4,7 @@ # Makefile for port/darwin # # IDENTIFICATION -# $Header: /cvsroot/pgsql/src/backend/port/darwin/Makefile,v 1.1 2000/12/11 00:49:54 tgl Exp $ +# $Header: /cvsroot/pgsql/src/backend/port/darwin/Makefile,v 1.2 2001/11/08 04:24:03 tgl Exp $ # #------------------------------------------------------------------------- @@ -12,7 +12,7 @@ subdir = src/backend/port/darwin top_builddir = ../../../.. include $(top_builddir)/src/Makefile.global -OBJS = sem.o +OBJS = sem.o system.o all: SUBSYS.o diff --git a/src/backend/port/darwin/README b/src/backend/port/darwin/README new file mode 100644 index 0000000000..1a056bd514 --- /dev/null +++ b/src/backend/port/darwin/README @@ -0,0 +1,38 @@ +The file system.c included herein is taken directly from Apple's Darwin +open-source CVS archives, and is redistributed under the BSD copyright +notice it bears. (According to Apple's CVS logs, their version is +identical to the FreeBSD original.) It provides our own implementation of +the system(3) function, which ought by all rights to be identical to the +one provided in libc on Darwin machines. Nonetheless, this version works, +whereas the one that actually ships with Mac OS X 10.1 doesn't. The +shipped version appears to disconnect the calling process from any shared +memory segments it is attached to. (The symptom seen in PostgreSQL is +that a backend attempting to execute CREATE DATABASE core-dumps.) I would +love to know why there is a discrepancy between the published source and +the actual behavior --- tgl 7-Nov-2001. + +Appropriate bug reports have been filed with Apple --- see +Radar Bug#s 2767956, 2683531, 2805147. One hopes we can retire this +kluge in the not too distant future. + + +As of PostgreSQL 7.2 and Mac OS X 10.1, one should expect warnings +like these while linking the backend: + +/usr/bin/ld: warning unused multiple definitions of symbol _system +port/SUBSYS.o definition of _system in section (__TEXT,__text) +/usr/lib/libm.dylib(system.o) unused definition of _system +/usr/bin/ld: warning unused multiple definitions of symbol _semctl +port/SUBSYS.o definition of _semctl in section (__TEXT,__text) +/usr/lib/libm.dylib(semctl.o) unused definition of _semctl +/usr/bin/ld: warning unused multiple definitions of symbol _semget +port/SUBSYS.o definition of _semget in section (__TEXT,__text) +/usr/lib/libm.dylib(semget.o) unused definition of _semget +/usr/bin/ld: warning unused multiple definitions of symbol _semop +port/SUBSYS.o definition of _semop in section (__TEXT,__text) +/usr/lib/libm.dylib(semop.o) unused definition of _semop + +The first of these shows us overriding system() per the above-described +hack. The rest show sem.c overriding the nonfunctional semaphore stubs +in libc. (Perhaps sem.c can also be retired someday, but semget support +is reportedly not high on Apple's to-do list.) diff --git a/src/backend/port/darwin/system.c b/src/backend/port/darwin/system.c new file mode 100644 index 0000000000..23a548a111 --- /dev/null +++ b/src/backend/port/darwin/system.c @@ -0,0 +1,96 @@ +/* + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/lib/libc/stdlib/system.c,v 1.6 2000/03/16 02:14:41 jasone Exp $ + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)system.c 8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include +#include +#include +#include + +int system(const char *command); + +int +system(const char *command) +{ + pid_t pid; + int pstat; + struct sigaction ign, intact, quitact; + sigset_t newsigblock, oldsigblock; + + if (!command) /* just checking... */ + return(1); + + /* + * Ignore SIGINT and SIGQUIT, block SIGCHLD. Remember to save + * existing signal dispositions. + */ + ign.sa_handler = SIG_IGN; + (void)sigemptyset(&ign.sa_mask); + ign.sa_flags = 0; + (void)sigaction(SIGINT, &ign, &intact); + (void)sigaction(SIGQUIT, &ign, &quitact); + (void)sigemptyset(&newsigblock); + (void)sigaddset(&newsigblock, SIGCHLD); + (void)sigprocmask(SIG_BLOCK, &newsigblock, &oldsigblock); + switch(pid = fork()) { + case -1: /* error */ + break; + case 0: /* child */ + /* + * Restore original signal dispositions and exec the command. + */ + (void)sigaction(SIGINT, &intact, NULL); + (void)sigaction(SIGQUIT, &quitact, NULL); + (void)sigprocmask(SIG_SETMASK, &oldsigblock, NULL); + execl(_PATH_BSHELL, "sh", "-c", command, (char *)NULL); + _exit(127); + default: /* parent */ + do { + pid = wait4(pid, &pstat, 0, (struct rusage *)0); + } while (pid == -1 && errno == EINTR); + break; + } + (void)sigaction(SIGINT, &intact, NULL); + (void)sigaction(SIGQUIT, &quitact, NULL); + (void)sigprocmask(SIG_SETMASK, &oldsigblock, NULL); + return(pid == -1 ? -1 : pstat); +} -- 2.11.0