mirror of https://github.com/postgres/postgres
Allow Win32 to compile under MinGW. Major changes are:
Win32 port is now called 'win32' rather than 'win' add -lwsock32 on Win32 make gethostname() be only used when kerberos4 is enabled use /port/getopt.c new /port/opendir.c routines disable GUC unix_socket_group on Win32 convert some keywords.c symbols to KEYWORD_P to prevent conflict create new FCNTL_NONBLOCK macro to turn off socket blocking create new /include/port.h file that has /port prototypes, move out of c.h new /include/port/win32_include dir to hold missing include files work around ERROR being defined in Win32 includes
This commit is contained in:
parent
2c0556068f
commit
12c9423832
|
@ -1393,7 +1393,7 @@ case $host_os in
|
|||
hpux*) template=hpux ;;
|
||||
irix*) template=irix5 ;;
|
||||
linux*) template=linux ;;
|
||||
mingw*) template=win ;;
|
||||
mingw*) template=win32 ;;
|
||||
netbsd*) template=netbsd ;;
|
||||
nextstep*) template=nextstep ;;
|
||||
openbsd*) template=openbsd ;;
|
||||
|
@ -2808,7 +2808,6 @@ echo "$as_me: WARNING: *** Library directory $dir does not exist." >&2;}
|
|||
done
|
||||
IFS=$ac_save_IFS
|
||||
|
||||
|
||||
#
|
||||
# Tcl/Tk
|
||||
#
|
||||
|
@ -5236,6 +5235,65 @@ _ACEOF
|
|||
|
||||
fi
|
||||
|
||||
|
||||
echo "$as_me:$LINENO: checking for main in -lwsock32" >&5
|
||||
echo $ECHO_N "checking for main in -lwsock32... $ECHO_C" >&6
|
||||
if test "${ac_cv_lib_wsock32_main+set}" = set; then
|
||||
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||
else
|
||||
ac_check_lib_save_LIBS=$LIBS
|
||||
LIBS="-lwsock32 $LIBS"
|
||||
cat >conftest.$ac_ext <<_ACEOF
|
||||
#line $LINENO "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
|
||||
#ifdef F77_DUMMY_MAIN
|
||||
# ifdef __cplusplus
|
||||
extern "C"
|
||||
# endif
|
||||
int F77_DUMMY_MAIN() { return 1; }
|
||||
#endif
|
||||
int
|
||||
main ()
|
||||
{
|
||||
main ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
rm -f conftest.$ac_objext conftest$ac_exeext
|
||||
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
|
||||
(eval $ac_link) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); } &&
|
||||
{ ac_try='test -s conftest$ac_exeext'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; }; then
|
||||
ac_cv_lib_wsock32_main=yes
|
||||
else
|
||||
echo "$as_me: failed program was:" >&5
|
||||
cat conftest.$ac_ext >&5
|
||||
ac_cv_lib_wsock32_main=no
|
||||
fi
|
||||
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$ac_check_lib_save_LIBS
|
||||
fi
|
||||
echo "$as_me:$LINENO: result: $ac_cv_lib_wsock32_main" >&5
|
||||
echo "${ECHO_T}$ac_cv_lib_wsock32_main" >&6
|
||||
if test $ac_cv_lib_wsock32_main = yes; then
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define HAVE_LIBWSOCK32 1
|
||||
_ACEOF
|
||||
|
||||
LIBS="-lwsock32 $LIBS"
|
||||
|
||||
fi
|
||||
|
||||
echo "$as_me:$LINENO: checking for library containing getopt_long" >&5
|
||||
echo $ECHO_N "checking for library containing getopt_long... $ECHO_C" >&6
|
||||
if test "${ac_cv_search_getopt_long+set}" = set; then
|
||||
|
@ -6072,6 +6130,85 @@ echo "$as_me: error: library 'krb' is required for Kerberos 4" >&2;}
|
|||
{ (exit 1); exit 1; }; }
|
||||
fi
|
||||
|
||||
|
||||
for ac_func in gethostname
|
||||
do
|
||||
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
||||
echo "$as_me:$LINENO: checking for $ac_func" >&5
|
||||
echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
|
||||
if eval "test \"\${$as_ac_var+set}\" = set"; then
|
||||
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||
else
|
||||
cat >conftest.$ac_ext <<_ACEOF
|
||||
#line $LINENO "configure"
|
||||
#include "confdefs.h"
|
||||
/* System header to define __stub macros and hopefully few prototypes,
|
||||
which can conflict with char $ac_func (); below. */
|
||||
#include <assert.h>
|
||||
/* Override any gcc2 internal prototype to avoid an error. */
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
#endif
|
||||
/* We use char because int might match the return type of a gcc2
|
||||
builtin and then its argument prototype would still apply. */
|
||||
char $ac_func ();
|
||||
char (*f) ();
|
||||
|
||||
#ifdef F77_DUMMY_MAIN
|
||||
# ifdef __cplusplus
|
||||
extern "C"
|
||||
# endif
|
||||
int F77_DUMMY_MAIN() { return 1; }
|
||||
#endif
|
||||
int
|
||||
main ()
|
||||
{
|
||||
/* The GNU C library defines this for functions which it implements
|
||||
to always fail with ENOSYS. Some functions are actually named
|
||||
something starting with __ and the normal name is an alias. */
|
||||
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
|
||||
choke me
|
||||
#else
|
||||
f = $ac_func;
|
||||
#endif
|
||||
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
rm -f conftest.$ac_objext conftest$ac_exeext
|
||||
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
|
||||
(eval $ac_link) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); } &&
|
||||
{ ac_try='test -s conftest$ac_exeext'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; }; then
|
||||
eval "$as_ac_var=yes"
|
||||
else
|
||||
echo "$as_me: failed program was:" >&5
|
||||
cat conftest.$ac_ext >&5
|
||||
eval "$as_ac_var=no"
|
||||
fi
|
||||
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
|
||||
fi
|
||||
echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
|
||||
echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
|
||||
if test `eval echo '${'$as_ac_var'}'` = yes; then
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
|
||||
_ACEOF
|
||||
|
||||
else
|
||||
LIBOBJS="$LIBOBJS $ac_func.$ac_objext"
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
fi
|
||||
|
||||
if test "$with_krb5" = yes ; then
|
||||
|
@ -11080,7 +11217,7 @@ fi
|
|||
|
||||
|
||||
|
||||
for ac_func in crypt fseeko gethostname getopt_long getrusage inet_aton random rint srandom strcasecmp strdup strerror strtol strtoul
|
||||
for ac_func in crypt fseeko getopt getopt_long getrusage inet_aton random rint srandom strcasecmp strdup strerror strtol strtoul
|
||||
do
|
||||
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
|
||||
echo "$as_me:$LINENO: checking for $ac_func" >&5
|
||||
|
@ -11258,9 +11395,8 @@ LIBOBJS="$LIBOBJS qsort.$ac_objext" ;;
|
|||
esac
|
||||
|
||||
# Win32 can't to rename or unlink on an open file
|
||||
case $host_os in win32*)
|
||||
LIBOBJS="$LIBOBJS dirmod.$ac_objext"
|
||||
LIBOBJS="$LIBOBJS opendir.$ac_objext" ;;
|
||||
case $host_os in win32*|mingw*)
|
||||
LIBOBJS="$LIBOBJS dirmod.$ac_objext" ;;
|
||||
esac
|
||||
|
||||
if test "$with_readline" = yes; then
|
||||
|
|
14
configure.in
14
configure.in
|
@ -1,5 +1,5 @@
|
|||
dnl Process this file with autoconf to produce a configure script.
|
||||
dnl $Header: /cvsroot/pgsql/configure.in,v 1.249 2003/05/10 04:03:37 momjian Exp $
|
||||
dnl $Header: /cvsroot/pgsql/configure.in,v 1.250 2003/05/15 16:35:27 momjian Exp $
|
||||
dnl
|
||||
dnl Developers, please strive to achieve this order:
|
||||
dnl
|
||||
|
@ -65,7 +65,7 @@ case $host_os in
|
|||
hpux*) template=hpux ;;
|
||||
irix*) template=irix5 ;;
|
||||
linux*) template=linux ;;
|
||||
mingw*) template=win ;;
|
||||
mingw*) template=win32 ;;
|
||||
netbsd*) template=netbsd ;;
|
||||
nextstep*) template=nextstep ;;
|
||||
openbsd*) template=openbsd ;;
|
||||
|
@ -319,7 +319,6 @@ for dir in $LIBRARY_DIRS $SRCH_LIB; do
|
|||
done
|
||||
IFS=$ac_save_IFS
|
||||
|
||||
|
||||
#
|
||||
# Tcl/Tk
|
||||
#
|
||||
|
@ -607,6 +606,7 @@ AC_CHECK_LIB(BSD, main)
|
|||
AC_CHECK_LIB(gen, main)
|
||||
AC_CHECK_LIB(PW, main)
|
||||
AC_CHECK_LIB(resolv, main)
|
||||
AC_CHECK_LIB(wsock32, main)
|
||||
AC_SEARCH_LIBS(getopt_long, [getopt gnugetopt])
|
||||
# QNX:
|
||||
AC_CHECK_LIB(unix, main)
|
||||
|
@ -639,6 +639,7 @@ fi
|
|||
if test "$with_krb4" = yes ; then
|
||||
AC_CHECK_LIB(des, des_encrypt, [], [AC_MSG_ERROR([library 'des' is required for Kerberos 4])])
|
||||
AC_CHECK_LIB(krb, krb_sendauth, [], [AC_MSG_ERROR([library 'krb' is required for Kerberos 4])])
|
||||
AC_REPLACE_FUNCS([gethostname])
|
||||
fi
|
||||
|
||||
if test "$with_krb5" = yes ; then
|
||||
|
@ -839,7 +840,7 @@ else
|
|||
AC_CHECK_FUNCS([fpclass fp_class fp_class_d class], [break])
|
||||
fi
|
||||
|
||||
AC_REPLACE_FUNCS([crypt fseeko gethostname getopt_long getrusage inet_aton random rint srandom strcasecmp strdup strerror strtol strtoul])
|
||||
AC_REPLACE_FUNCS([crypt fseeko getopt getopt_long getrusage inet_aton random rint srandom strcasecmp strdup strerror strtol strtoul])
|
||||
|
||||
# system's version of getaddrinfo(), if any, may be used only if we found
|
||||
# a definition for struct addrinfo; see notes in src/include/getaddrinfo.h
|
||||
|
@ -862,9 +863,8 @@ AC_LIBOBJ(qsort) ;;
|
|||
esac
|
||||
|
||||
# Win32 can't to rename or unlink on an open file
|
||||
case $host_os in win32*)
|
||||
AC_LIBOBJ(dirmod)
|
||||
AC_LIBOBJ(opendir) ;;
|
||||
case $host_os in win32*|mingw*)
|
||||
AC_LIBOBJ(dirmod) ;;
|
||||
esac
|
||||
|
||||
if test "$with_readline" = yes; then
|
||||
|
|
2
doc/TODO
2
doc/TODO
|
@ -1,6 +1,6 @@
|
|||
TODO list for PostgreSQL
|
||||
========================
|
||||
Last updated: Wed Apr 2 17:44:34 EST 2003
|
||||
Last updated: Thu May 15 12:10:39 EDT 2003
|
||||
|
||||
Current maintainer: Bruce Momjian (pgman@candle.pha.pa.us)
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/libpq/be-secure.c,v 1.31 2003/04/25 04:37:23 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/libpq/be-secure.c,v 1.32 2003/05/15 16:35:28 momjian Exp $
|
||||
*
|
||||
* Since the server static private key ($DataDir/server.key)
|
||||
* will normally be stored unencrypted so that the database
|
||||
|
@ -85,16 +85,12 @@
|
|||
#include "libpq/libpq.h"
|
||||
#include "miscadmin.h"
|
||||
|
||||
#ifdef WIN32
|
||||
#include "win32.h"
|
||||
#else
|
||||
#include <sys/socket.h>
|
||||
#include <unistd.h>
|
||||
#include <netdb.h>
|
||||
#include <netinet/in.h>
|
||||
#ifdef HAVE_NETINET_TCP_H
|
||||
#include <netinet/tcp.h>
|
||||
#endif
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/backend/libpq/pqcomm.c,v 1.152 2003/04/25 01:24:00 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/libpq/pqcomm.c,v 1.153 2003/05/15 16:35:28 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -357,6 +357,9 @@ Setup_AF_UNIX(void)
|
|||
Assert(Unix_socket_group);
|
||||
if (Unix_socket_group[0] != '\0')
|
||||
{
|
||||
#ifdef WIN32
|
||||
elog(FATAL, "Config value 'unix_socket_group' not supported on this platform");
|
||||
#else
|
||||
char *endptr;
|
||||
unsigned long int val;
|
||||
gid_t gid;
|
||||
|
@ -385,6 +388,7 @@ Setup_AF_UNIX(void)
|
|||
sock_path, strerror(errno));
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (chmod(sock_path, Unix_socket_permissions) == -1)
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/main/main.c,v 1.56 2002/11/08 20:23:56 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/main/main.c,v 1.57 2003/05/15 16:35:28 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -159,13 +159,14 @@ main(int argc, char *argv[])
|
|||
strcmp(argv[1], "--version") == 0 ||
|
||||
strcmp(argv[1], "-V") == 0)))
|
||||
{
|
||||
#ifndef WIN32
|
||||
#ifndef __BEOS__
|
||||
/*
|
||||
* Make sure we are not running as root.
|
||||
*
|
||||
* BeOS currently runs everything as root :-(, so this check must be
|
||||
* temporarily disabled there...
|
||||
*/
|
||||
#ifndef __BEOS__
|
||||
if (geteuid() == 0)
|
||||
{
|
||||
fprintf(stderr, gettext(
|
||||
|
@ -176,7 +177,7 @@ main(int argc, char *argv[])
|
|||
));
|
||||
exit(1);
|
||||
}
|
||||
#endif /* __BEOS__ */
|
||||
#endif /* !__BEOS__ */
|
||||
|
||||
/*
|
||||
* Also make sure that real and effective uids are the same.
|
||||
|
@ -193,6 +194,7 @@ main(int argc, char *argv[])
|
|||
argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
#endif /* !WIN32 */
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -221,6 +223,7 @@ main(int argc, char *argv[])
|
|||
* specifying current userid as the "authenticated" Postgres user
|
||||
* name.
|
||||
*/
|
||||
#ifndef WIN32
|
||||
pw = getpwuid(geteuid());
|
||||
if (pw == NULL)
|
||||
{
|
||||
|
@ -230,6 +233,18 @@ main(int argc, char *argv[])
|
|||
}
|
||||
/* Allocate new memory because later getpwuid() calls can overwrite it */
|
||||
pw_name_persist = strdup(pw->pw_name);
|
||||
#else
|
||||
{
|
||||
long namesize = 256 /* UNLEN */ + 1;
|
||||
|
||||
pw_name_persist = malloc(namesize);
|
||||
if (!GetUserName(pw_name_persist, &namesize))
|
||||
{
|
||||
fprintf(stderr, "%s: GetUserName failed\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
exit(PostgresMain(argc, new_argv, pw_name_persist));
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.413 2003/05/04 00:03:55 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.414 2003/05/15 16:35:28 momjian Exp $
|
||||
*
|
||||
* HISTORY
|
||||
* AUTHOR DATE MAJOR EVENT
|
||||
|
@ -322,12 +322,12 @@ static void doNegateFloat(Value *v);
|
|||
*/
|
||||
|
||||
/* ordinary key words in alphabetical order */
|
||||
%token <keyword> ABORT_P ABSOLUTE ACCESS ACTION ADD AFTER
|
||||
%token <keyword> ABORT_P ABSOLUTE_P ACCESS ACTION ADD AFTER
|
||||
AGGREGATE ALL ALTER ANALYSE ANALYZE AND ANY ARRAY AS ASC
|
||||
ASSERTION ASSIGNMENT AT AUTHORIZATION
|
||||
|
||||
BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
|
||||
BOOLEAN BOTH BY
|
||||
BOOLEAN_P BOTH BY
|
||||
|
||||
CACHE CALLED CASCADE CASE CAST CHAIN CHAR_P
|
||||
CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
|
||||
|
@ -336,9 +336,9 @@ static void doNegateFloat(Value *v);
|
|||
CREATEUSER CROSS CURRENT_DATE CURRENT_TIME
|
||||
CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
|
||||
|
||||
DATABASE DAY_P DEALLOCATE DEC DECIMAL DECLARE DEFAULT
|
||||
DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT
|
||||
DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS
|
||||
DESC DISTINCT DO DOMAIN_P DOUBLE DROP
|
||||
DESC DISTINCT DO DOMAIN_P DOUBLE_P DROP
|
||||
|
||||
EACH ELSE ENCODING ENCRYPTED END_P ESCAPE EXCEPT
|
||||
EXCLUSIVE EXECUTE EXISTS EXPLAIN EXTERNAL EXTRACT
|
||||
|
@ -351,8 +351,8 @@ static void doNegateFloat(Value *v);
|
|||
HANDLER HAVING HOLD HOUR_P
|
||||
|
||||
ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IN_P INCREMENT
|
||||
INDEX INHERITS INITIALLY INNER_P INOUT INPUT
|
||||
INSENSITIVE INSERT INSTEAD INT INTEGER INTERSECT
|
||||
INDEX INHERITS INITIALLY INNER_P INOUT INPUT_P
|
||||
INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT
|
||||
INTERVAL INTO INVOKER IS ISNULL ISOLATION
|
||||
|
||||
JOIN
|
||||
|
@ -373,18 +373,17 @@ static void doNegateFloat(Value *v);
|
|||
ORDER OUT_P OUTER_P OVERLAPS OVERLAY OWNER
|
||||
|
||||
PARTIAL PASSWORD PATH_P PENDANT PLACING POSITION
|
||||
PRECISION PRESERVE PREPARE PRIMARY PRIOR PRIVILEGES PROCEDURAL
|
||||
PROCEDURE
|
||||
PRECISION PRESERVE PREPARE PRIMARY
|
||||
PRIOR PRIVILEGES PROCEDURAL PROCEDURE
|
||||
|
||||
READ REAL RECHECK REFERENCES REINDEX RELATIVE RENAME REPLACE
|
||||
READ REAL RECHECK REFERENCES REINDEX RELATIVE_P RENAME REPLACE
|
||||
RESET RESTART RESTRICT RETURNS REVOKE RIGHT ROLLBACK ROW ROWS
|
||||
RULE
|
||||
|
||||
SCHEMA SCROLL SECOND_P SECURITY SELECT SEQUENCE
|
||||
SERIALIZABLE SESSION SESSION_USER SET SETOF SHARE
|
||||
SHOW SIMILAR SIMPLE SMALLINT SOME STABLE START STATEMENT
|
||||
STATISTICS STDIN STDOUT STORAGE STRICT SUBSTRING
|
||||
SYSID
|
||||
STATISTICS STDIN STDOUT STORAGE STRICT_P SUBSTRING SYSID
|
||||
|
||||
TABLE TEMP TEMPLATE TEMPORARY THEN TIME TIMESTAMP
|
||||
TO TOAST TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P
|
||||
|
@ -2675,14 +2674,14 @@ fetch_direction:
|
|||
n->howMany = -1;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| ABSOLUTE fetch_count
|
||||
| ABSOLUTE_P fetch_count
|
||||
{
|
||||
FetchStmt *n = makeNode(FetchStmt);
|
||||
n->direction = FETCH_ABSOLUTE;
|
||||
n->howMany = $2;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
| RELATIVE fetch_count
|
||||
| RELATIVE_P fetch_count
|
||||
{
|
||||
FetchStmt *n = makeNode(FetchStmt);
|
||||
n->direction = FETCH_RELATIVE;
|
||||
|
@ -3146,15 +3145,15 @@ createfunc_opt_item:
|
|||
{
|
||||
$$ = makeDefElem("volatility", (Node *)makeString("volatile"));
|
||||
}
|
||||
| CALLED ON NULL_P INPUT
|
||||
| CALLED ON NULL_P INPUT_P
|
||||
{
|
||||
$$ = makeDefElem("strict", (Node *)makeInteger(FALSE));
|
||||
}
|
||||
| RETURNS NULL_P ON NULL_P INPUT
|
||||
| RETURNS NULL_P ON NULL_P INPUT_P
|
||||
{
|
||||
$$ = makeDefElem("strict", (Node *)makeInteger(TRUE));
|
||||
}
|
||||
| STRICT
|
||||
| STRICT_P
|
||||
{
|
||||
$$ = makeDefElem("strict", (Node *)makeInteger(TRUE));
|
||||
}
|
||||
|
@ -5077,7 +5076,7 @@ GenericType:
|
|||
* Provide real DECIMAL() and NUMERIC() implementations now - Jan 1998-12-30
|
||||
* - thomas 1997-09-18
|
||||
*/
|
||||
Numeric: INT
|
||||
Numeric: INT_P
|
||||
{
|
||||
$$ = SystemTypeName("int4");
|
||||
}
|
||||
|
@ -5101,11 +5100,11 @@ Numeric: INT
|
|||
{
|
||||
$$ = $2;
|
||||
}
|
||||
| DOUBLE PRECISION
|
||||
| DOUBLE_P PRECISION
|
||||
{
|
||||
$$ = SystemTypeName("float8");
|
||||
}
|
||||
| DECIMAL opt_decimal
|
||||
| DECIMAL_P opt_decimal
|
||||
{
|
||||
$$ = SystemTypeName("numeric");
|
||||
$$->typmod = $2;
|
||||
|
@ -5120,7 +5119,7 @@ Numeric: INT
|
|||
$$ = SystemTypeName("numeric");
|
||||
$$->typmod = $2;
|
||||
}
|
||||
| BOOLEAN
|
||||
| BOOLEAN_P
|
||||
{
|
||||
$$ = SystemTypeName("bool");
|
||||
}
|
||||
|
@ -7179,7 +7178,7 @@ ColLabel: IDENT { $$ = $1; }
|
|||
*/
|
||||
unreserved_keyword:
|
||||
ABORT_P
|
||||
| ABSOLUTE
|
||||
| ABSOLUTE_P
|
||||
| ACCESS
|
||||
| ACTION
|
||||
| ADD
|
||||
|
@ -7222,7 +7221,7 @@ unreserved_keyword:
|
|||
| DELIMITER
|
||||
| DELIMITERS
|
||||
| DOMAIN_P
|
||||
| DOUBLE
|
||||
| DOUBLE_P
|
||||
| DROP
|
||||
| EACH
|
||||
| ENCODING
|
||||
|
@ -7248,7 +7247,7 @@ unreserved_keyword:
|
|||
| INDEX
|
||||
| INHERITS
|
||||
| INOUT
|
||||
| INPUT
|
||||
| INPUT_P
|
||||
| INSENSITIVE
|
||||
| INSERT
|
||||
| INSTEAD
|
||||
|
@ -7299,7 +7298,7 @@ unreserved_keyword:
|
|||
| READ
|
||||
| RECHECK
|
||||
| REINDEX
|
||||
| RELATIVE
|
||||
| RELATIVE_P
|
||||
| RENAME
|
||||
| REPLACE
|
||||
| RESET
|
||||
|
@ -7328,8 +7327,8 @@ unreserved_keyword:
|
|||
| STDIN
|
||||
| STDOUT
|
||||
| STORAGE
|
||||
| STRICT
|
||||
| SYSID
|
||||
| STRICT_P
|
||||
| TEMP
|
||||
| TEMPLATE
|
||||
| TEMPORARY
|
||||
|
@ -7374,17 +7373,17 @@ unreserved_keyword:
|
|||
col_name_keyword:
|
||||
BIGINT
|
||||
| BIT
|
||||
| BOOLEAN
|
||||
| BOOLEAN_P
|
||||
| CHAR_P
|
||||
| CHARACTER
|
||||
| COALESCE
|
||||
| CONVERT
|
||||
| DEC
|
||||
| DECIMAL
|
||||
| DECIMAL_P
|
||||
| EXISTS
|
||||
| EXTRACT
|
||||
| FLOAT_P
|
||||
| INT
|
||||
| INT_P
|
||||
| INTEGER
|
||||
| INTERVAL
|
||||
| NCHAR
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.138 2003/04/08 23:20:02 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.139 2003/05/15 16:35:28 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -31,7 +31,7 @@
|
|||
static const ScanKeyword ScanKeywords[] = {
|
||||
/* name, value */
|
||||
{"abort", ABORT_P},
|
||||
{"absolute", ABSOLUTE},
|
||||
{"absolute", ABSOLUTE_P},
|
||||
{"access", ACCESS},
|
||||
{"action", ACTION},
|
||||
{"add", ADD},
|
||||
|
@ -57,7 +57,7 @@ static const ScanKeyword ScanKeywords[] = {
|
|||
{"bigint", BIGINT},
|
||||
{"binary", BINARY},
|
||||
{"bit", BIT},
|
||||
{"boolean", BOOLEAN},
|
||||
{"boolean", BOOLEAN_P},
|
||||
{"both", BOTH},
|
||||
{"by", BY},
|
||||
{"cache", CACHE},
|
||||
|
@ -99,7 +99,7 @@ static const ScanKeyword ScanKeywords[] = {
|
|||
{"day", DAY_P},
|
||||
{"deallocate", DEALLOCATE},
|
||||
{"dec", DEC},
|
||||
{"decimal", DECIMAL},
|
||||
{"decimal", DECIMAL_P},
|
||||
{"declare", DECLARE},
|
||||
{"default", DEFAULT},
|
||||
{"deferrable", DEFERRABLE},
|
||||
|
@ -112,7 +112,7 @@ static const ScanKeyword ScanKeywords[] = {
|
|||
{"distinct", DISTINCT},
|
||||
{"do", DO},
|
||||
{"domain", DOMAIN_P},
|
||||
{"double", DOUBLE},
|
||||
{"double", DOUBLE_P},
|
||||
{"drop", DROP},
|
||||
{"each", EACH},
|
||||
{"else", ELSE},
|
||||
|
@ -157,11 +157,11 @@ static const ScanKeyword ScanKeywords[] = {
|
|||
{"initially", INITIALLY},
|
||||
{"inner", INNER_P},
|
||||
{"inout", INOUT},
|
||||
{"input", INPUT},
|
||||
{"input", INPUT_P},
|
||||
{"insensitive", INSENSITIVE},
|
||||
{"insert", INSERT},
|
||||
{"instead", INSTEAD},
|
||||
{"int", INT},
|
||||
{"int", INT_P},
|
||||
{"integer", INTEGER},
|
||||
{"intersect", INTERSECT},
|
||||
{"interval", INTERVAL},
|
||||
|
@ -246,7 +246,7 @@ static const ScanKeyword ScanKeywords[] = {
|
|||
{"recheck", RECHECK},
|
||||
{"references", REFERENCES},
|
||||
{"reindex", REINDEX},
|
||||
{"relative", RELATIVE},
|
||||
{"relative", RELATIVE_P},
|
||||
{"rename", RENAME},
|
||||
{"replace", REPLACE},
|
||||
{"reset", RESET},
|
||||
|
@ -283,7 +283,7 @@ static const ScanKeyword ScanKeywords[] = {
|
|||
{"stdin", STDIN},
|
||||
{"stdout", STDOUT},
|
||||
{"storage", STORAGE},
|
||||
{"strict", STRICT},
|
||||
{"strict", STRICT_P},
|
||||
{"substring", SUBSTRING},
|
||||
{"sysid", SYSID},
|
||||
{"table", TABLE},
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
# be converted to Method 2.
|
||||
#
|
||||
# IDENTIFICATION
|
||||
# $Header: /cvsroot/pgsql/src/backend/port/Makefile,v 1.18 2002/07/27 20:10:05 petere Exp $
|
||||
# $Header: /cvsroot/pgsql/src/backend/port/Makefile,v 1.19 2003/05/15 16:35:29 momjian Exp $
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
|
||||
|
@ -26,7 +26,7 @@ OBJS+=dynloader.o pg_sema.o pg_shmem.o
|
|||
OBJS+=$(TAS)
|
||||
|
||||
ifeq ($(PORTNAME), qnx4)
|
||||
OBJS+=getrusage.o qnx4/SUBSYS.o
|
||||
OBJS+=qnx4/SUBSYS.o
|
||||
endif
|
||||
ifeq ($(PORTNAME), beos)
|
||||
OBJS+=beos/SUBSYS.o
|
||||
|
@ -34,6 +34,9 @@ endif
|
|||
ifeq ($(PORTNAME), darwin)
|
||||
OBJS+=darwin/SUBSYS.o
|
||||
endif
|
||||
ifeq ($(PORTNAME), win32)
|
||||
OBJS+=win32/SUBSYS.o
|
||||
endif
|
||||
|
||||
all: SUBSYS.o
|
||||
|
||||
|
@ -55,6 +58,11 @@ darwin/SUBSYS.o: darwin.dir
|
|||
darwin.dir:
|
||||
$(MAKE) -C darwin all
|
||||
|
||||
win32/SUBSYS.o: win32.dir
|
||||
|
||||
win32.dir:
|
||||
$(MAKE) -C win32 all
|
||||
|
||||
tas.o: tas.s
|
||||
$(CC) $(CFLAGS) -c $<
|
||||
|
||||
|
@ -67,3 +75,5 @@ distclean clean:
|
|||
$(MAKE) -C beos clean
|
||||
$(MAKE) -C darwin clean
|
||||
$(MAKE) -C qnx4 clean
|
||||
$(MAKE) -C win32 clean
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Header: /cvsroot/pgsql/src/backend/port/dynloader/Attic/win.c,v 1.2 2003/03/21 17:18:34 petere Exp $ */
|
||||
/* $Header: /cvsroot/pgsql/src/backend/port/dynloader/win32.c,v 1.1 2003/05/15 16:35:29 momjian Exp $ */
|
||||
|
||||
#include <windows.h>
|
||||
|
|
@ -10,7 +10,6 @@
|
|||
|
||||
#include "postgres.h"
|
||||
#include "storage/shmem.h"
|
||||
#include "sema.h"
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
|
@ -131,7 +130,8 @@ semget(int semKey, int semNum, int flags)
|
|||
Size sem_set_size = sizeof(win32_sem_set_hdr) + semNum * (sizeof(HANDLE) + sizeof(int));
|
||||
HANDLE *sem_handles = NULL;
|
||||
int *sem_counts = NULL;
|
||||
|
||||
int i;
|
||||
|
||||
sec_attrs.nLength = sizeof(sec_attrs);
|
||||
sec_attrs.lpSecurityDescriptor = NULL;
|
||||
sec_attrs.bInheritHandle = TRUE;
|
||||
|
@ -158,7 +158,7 @@ semget(int semKey, int semNum, int flags)
|
|||
sem_handles = (HANDLE *) ((off_t) new_set + new_set->m_semaphoreHandles);
|
||||
sem_counts = (int *) ((off_t) new_set + new_set->m_semaphoreCounts);
|
||||
|
||||
for (int i = 0; i < semNum && ans; ++i)
|
||||
for (i = 0; i < semNum && ans; ++i)
|
||||
{
|
||||
strcpy(num_part, _itoa(i, cur_num, 10));
|
||||
|
||||
|
@ -186,8 +186,9 @@ semget(int semKey, int semNum, int flags)
|
|||
return MAKE_OFFSET(new_set);
|
||||
else
|
||||
{
|
||||
int i;
|
||||
/* Blow away what we've got right now... */
|
||||
for (int i = 0; i < semNum; ++i)
|
||||
for (i = 0; i < semNum; ++i)
|
||||
{
|
||||
if (sem_handles[i])
|
||||
CloseHandle(sem_handles[i]);
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
*
|
||||
* Copyright (c) 2001-2003, PostgreSQL Global Development Group
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/backend/postmaster/pgstat.c,v 1.35 2003/04/27 20:09:44 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/postmaster/pgstat.c,v 1.36 2003/05/15 16:35:29 momjian Exp $
|
||||
* ----------
|
||||
*/
|
||||
#include "postgres.h"
|
||||
|
@ -217,7 +217,7 @@ pgstat_init(void)
|
|||
* messages will be discarded; backends won't block waiting to send
|
||||
* messages to the collector.
|
||||
*/
|
||||
if (fcntl(pgStatSock, F_SETFL, O_NONBLOCK) < 0)
|
||||
if (FCNTL_NONBLOCK(pgStatSock) < 0)
|
||||
{
|
||||
elog(LOG, "PGSTAT: fcntl() failed: %m");
|
||||
goto startup_failed;
|
||||
|
@ -1520,7 +1520,7 @@ pgstat_recvbuffer(void)
|
|||
* Set the write pipe to nonblock mode, so that we cannot block when
|
||||
* the collector falls behind.
|
||||
*/
|
||||
if (fcntl(writePipe, F_SETFL, O_NONBLOCK) < 0)
|
||||
if (FCNTL_NONBLOCK(writePipe) < 0)
|
||||
{
|
||||
elog(LOG, "PGSTATBUFF: fcntl() failed: %m");
|
||||
exit(1);
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.327 2003/05/10 18:15:42 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.328 2003/05/15 16:35:29 momjian Exp $
|
||||
*
|
||||
* NOTES
|
||||
*
|
||||
|
@ -211,6 +211,11 @@ bool LogSourcePort;
|
|||
bool Log_connections = false;
|
||||
bool Db_user_namespace = false;
|
||||
|
||||
/* For FNCTL_NONBLOCK */
|
||||
#if defined(WIN32) || defined(__BEOS__)
|
||||
long ioctlsocket_ret;
|
||||
#endif
|
||||
|
||||
/* list of library:init-function to be preloaded */
|
||||
char *preload_libraries_string = NULL;
|
||||
|
||||
|
@ -1708,6 +1713,9 @@ reaper(SIGNAL_ARGS)
|
|||
{
|
||||
int save_errno = errno;
|
||||
|
||||
#ifdef WIN32
|
||||
#warning fix waidpid for Win32
|
||||
#else
|
||||
#ifdef HAVE_WAITPID
|
||||
int status; /* backend exit status */
|
||||
|
||||
|
@ -1807,6 +1815,7 @@ reaper(SIGNAL_ARGS)
|
|||
CleanupProc(pid, exitstatus);
|
||||
|
||||
} /* loop over pending child-death reports */
|
||||
#endif
|
||||
|
||||
if (FatalError)
|
||||
{
|
||||
|
@ -2141,23 +2150,14 @@ report_fork_failure_to_client(Port *port, int errnum)
|
|||
{
|
||||
char buffer[1000];
|
||||
|
||||
#ifdef __BEOS__
|
||||
int on = 1;
|
||||
#endif
|
||||
|
||||
/* Format the error message packet */
|
||||
snprintf(buffer, sizeof(buffer), "E%s%s\n",
|
||||
gettext("Server process fork() failed: "),
|
||||
strerror(errnum));
|
||||
|
||||
/* Set port to non-blocking. Don't do send() if this fails */
|
||||
#ifdef __BEOS__
|
||||
if (ioctl(port->sock, FIONBIO, &on) != 0)
|
||||
if (FCNTL_NONBLOCK(port->sock) < 0)
|
||||
return;
|
||||
#else
|
||||
if (fcntl(port->sock, F_SETFL, O_NONBLOCK) < 0)
|
||||
return;
|
||||
#endif
|
||||
|
||||
send(port->sock, buffer, strlen(buffer) + 1, 0);
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.129 2003/02/18 02:13:24 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/storage/lmgr/proc.c,v 1.130 2003/05/15 16:35:29 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -944,6 +944,9 @@ ProcSendSignal(BackendId procId)
|
|||
bool
|
||||
enable_sig_alarm(int delayms, bool is_statement_timeout)
|
||||
{
|
||||
#ifdef WIN32
|
||||
# warning add Win32 timer
|
||||
#else
|
||||
struct timeval fin_time;
|
||||
#ifndef __BEOS__
|
||||
struct itimerval timeval;
|
||||
|
@ -1012,7 +1015,7 @@ enable_sig_alarm(int delayms, bool is_statement_timeout)
|
|||
if (set_alarm(time_interval, B_ONE_SHOT_RELATIVE_ALARM) < 0)
|
||||
return false;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1026,6 +1029,9 @@ enable_sig_alarm(int delayms, bool is_statement_timeout)
|
|||
bool
|
||||
disable_sig_alarm(bool is_statement_timeout)
|
||||
{
|
||||
#ifdef WIN32
|
||||
#warning add Win32 timer
|
||||
#else
|
||||
/*
|
||||
* Always disable the interrupt if it is active; this avoids being
|
||||
* interrupted by the signal handler and thereby possibly getting
|
||||
|
@ -1065,7 +1071,7 @@ disable_sig_alarm(bool is_statement_timeout)
|
|||
if (!CheckStatementTimeout())
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1098,6 +1104,9 @@ CheckStatementTimeout(void)
|
|||
else
|
||||
{
|
||||
/* Not time yet, so (re)schedule the interrupt */
|
||||
#ifdef WIN32
|
||||
#warning add win32 timer
|
||||
#else
|
||||
#ifndef __BEOS__
|
||||
struct itimerval timeval;
|
||||
|
||||
|
@ -1120,6 +1129,7 @@ CheckStatementTimeout(void)
|
|||
(statement_fin_time.tv_usec - now.tv_usec);
|
||||
if (set_alarm(time_interval, B_ONE_SHOT_RELATIVE_ALARM) < 0)
|
||||
return false;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/init/Attic/findbe.c,v 1.32 2003/04/04 20:42:12 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/utils/init/Attic/findbe.c,v 1.33 2003/05/15 16:35:29 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -44,9 +44,11 @@ static int
|
|||
ValidateBinary(char *path)
|
||||
{
|
||||
struct stat buf;
|
||||
#ifndef WIN32
|
||||
uid_t euid;
|
||||
struct group *gp;
|
||||
struct passwd *pwp;
|
||||
#endif
|
||||
int i;
|
||||
int is_r = 0;
|
||||
int is_x = 0;
|
||||
|
@ -82,6 +84,11 @@ ValidateBinary(char *path)
|
|||
* Ensure that the file is both executable and readable (required for
|
||||
* dynamic loading).
|
||||
*/
|
||||
#ifdef WIN32
|
||||
is_r = buf.st_mode & S_IRUSR;
|
||||
is_x = buf.st_mode & S_IXUSR;
|
||||
return is_x ? (is_r ? 0 : -2) : -1;
|
||||
#else
|
||||
euid = geteuid();
|
||||
if (euid == buf.st_uid)
|
||||
{
|
||||
|
@ -125,6 +132,7 @@ ValidateBinary(char *path)
|
|||
elog(DEBUG2, "ValidateBinary: \"%s\" is not other read/execute",
|
||||
path);
|
||||
return is_x ? (is_r ? 0 : -2) : -1;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* Encoding names and routines for work with it. All
|
||||
* in this file is shared bedween FE and BE.
|
||||
*
|
||||
* $Id: encnames.c,v 1.12 2003/03/10 22:28:18 tgl Exp $
|
||||
* $Id: encnames.c,v 1.13 2003/05/15 16:35:29 momjian Exp $
|
||||
*/
|
||||
#ifdef FRONTEND
|
||||
#include "postgres_fe.h"
|
||||
|
@ -13,11 +13,7 @@
|
|||
#include "utils/builtins.h"
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
#include "win32.h"
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "mb/pg_wchar.h"
|
||||
#include <ctype.h>
|
||||
|
|
125
src/include/c.h
125
src/include/c.h
|
@ -12,7 +12,7 @@
|
|||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: c.h,v 1.144 2003/05/09 16:59:43 momjian Exp $
|
||||
* $Id: c.h,v 1.145 2003/05/15 16:35:29 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -52,7 +52,6 @@
|
|||
|
||||
#include "pg_config.h"
|
||||
#include "pg_config_manual.h" /* must be after pg_config.h */
|
||||
#include "pg_config_os.h"
|
||||
#include "postgres_ext.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -66,11 +65,14 @@
|
|||
#include <sys/types.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/fcntl.h> /* ensure O_BINARY is available */
|
||||
#include <fcntl.h> /* ensure O_BINARY is available */
|
||||
#ifdef HAVE_SUPPORTDEFS_H
|
||||
#include <SupportDefs.h>
|
||||
#endif
|
||||
|
||||
/* Must be here so we can redefine some functions on Win32 */
|
||||
#include "pg_config_os.h"
|
||||
|
||||
/* Must be before gettext() games below */
|
||||
#include <locale.h>
|
||||
|
||||
|
@ -696,64 +698,23 @@ typedef NameData *Name;
|
|||
#define PG_BINARY_W "w"
|
||||
#endif
|
||||
|
||||
#if !defined(WIN32) && !defined(__BEOS__)
|
||||
#define FCNTL_NONBLOCK(sock) fcntl(sock, F_SETFL, O_NONBLOCK)
|
||||
#else
|
||||
extern long ioctlsocket_ret;
|
||||
/* Returns non-0 on failure, while fcntl() returns -1 on failure */
|
||||
#ifdef WIN32
|
||||
#define FCNTL_NONBLOCK(sock) ((ioctlsocket(sock, FIONBIO, &ioctlsocket_ret) == 0) ? 0 : -1)
|
||||
#endif
|
||||
#ifdef __BEOS__
|
||||
#define FCNTL_NONBLOCK(sock) ((ioctl(sock, FIONBIO, &ioctlsocket_ret) == 0) ? 0 : -1)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(sun) && defined(__sparc__) && !defined(__SVR4)
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
/* Portable path handling for Unix/Win32 */
|
||||
bool is_absolute_path(const char *filename);
|
||||
char *first_path_separator(const char *filename);
|
||||
char *last_path_separator(const char *filename);
|
||||
char *get_progname(char *argv0);
|
||||
|
||||
#if defined(bsdi) || defined(netbsd)
|
||||
int fseeko(FILE *stream, off_t offset, int whence);
|
||||
off_t ftello(FILE *stream);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Win32 doesn't have reliable rename/unlink during concurrent access
|
||||
*/
|
||||
#if defined(WIN32) && !defined(FRONTEND)
|
||||
int pgrename(const char *from, const char *to);
|
||||
int pgunlink(const char *path);
|
||||
#define rename(path) pgrename(path)
|
||||
#define unlink(from, to) pgunlink(from, to)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Win32 doesn't have opendir/readdir/closedir()
|
||||
*/
|
||||
#ifdef WIN32
|
||||
struct dirent {
|
||||
ino_t d_ino; /* inode (always 1 on WIN32) */
|
||||
char d_name[MAX_PATH + 1]; /* filename (null terminated) */
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
HANDLE handle; /* handle for FindFirstFile or
|
||||
* FindNextFile */
|
||||
long offset; /* offset into directory */
|
||||
int finished; /* 1 if there are not more files */
|
||||
WIN32_FIND_DATA finddata; /* file data FindFirstFile or FindNextFile
|
||||
* returns */
|
||||
char *dir; /* the directory path we are reading */
|
||||
struct dirent ent; /* the dirent to return */
|
||||
} DIR;
|
||||
|
||||
extern DIR *opendir(const char *);
|
||||
extern struct dirent *readdir(DIR *);
|
||||
extern int closedir(DIR *);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Win32 requires a special close for sockets and pipes, while on Unix
|
||||
* close() does them all.
|
||||
*/
|
||||
#ifndef WIN32
|
||||
#define closesocket close
|
||||
#endif
|
||||
|
||||
/* These are for things that are one way on Unix and another on NT */
|
||||
#define NULL_DEV "/dev/null"
|
||||
|
||||
|
@ -794,37 +755,6 @@ extern int vsnprintf(char *str, size_t count, const char *fmt, va_list args);
|
|||
#define SIGNAL_ARGS int postgres_signal_arg
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Default "extern" declarations or macro substitutes for library routines.
|
||||
* When necessary, these routines are provided by files in src/port/.
|
||||
*/
|
||||
#ifndef HAVE_CRYPT
|
||||
char *crypt(const char *key, const char *setting);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_FSEEKO
|
||||
#define fseeko(a, b, c) fseek((a), (b), (c))
|
||||
#define ftello(a) ftell((a))
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_ISINF
|
||||
extern int isinf(double x);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_GETHOSTNAME
|
||||
extern int gethostname(char *name, int namelen);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_RINT
|
||||
extern double rint(double x);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_INET_ATON
|
||||
# include <netinet/in.h>
|
||||
# include <arpa/inet.h>
|
||||
extern int inet_aton(const char *cp, struct in_addr * addr);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* When there is no sigsetjmp, its functionality is provided by plain
|
||||
* setjmp. Incidentally, nothing provides setjmp's functionality in
|
||||
|
@ -836,22 +766,6 @@ extern int inet_aton(const char *cp, struct in_addr * addr);
|
|||
# define siglongjmp longjmp
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRCASECMP
|
||||
extern int strcasecmp(char *s1, char *s2);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRDUP
|
||||
extern char *strdup(char const *);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_RANDOM
|
||||
extern long random(void);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_SRANDOM
|
||||
extern void srandom(unsigned int seed);
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_FDATASYNC) && !HAVE_DECL_FDATASYNC
|
||||
extern int fdatasync(int fildes);
|
||||
#endif
|
||||
|
@ -868,4 +782,7 @@ extern int fdatasync(int fildes);
|
|||
# define HAVE_STRTOULL 1
|
||||
#endif
|
||||
|
||||
/* /port compatibility functions */
|
||||
#include "port.h"
|
||||
|
||||
#endif /* C_H */
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* for developers. If you edit any of these, be sure to do a *full*
|
||||
* rebuild (and an initdb if noted).
|
||||
*
|
||||
* $Id: pg_config_manual.h,v 1.2 2003/04/18 01:03:42 momjian Exp $
|
||||
* $Id: pg_config_manual.h,v 1.3 2003/05/15 16:35:29 momjian Exp $
|
||||
*------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
@ -130,7 +130,7 @@
|
|||
* Define this if your operating system supports AF_UNIX family
|
||||
* sockets.
|
||||
*/
|
||||
#if !defined(__QNX__) && !defined(__BEOS__)
|
||||
#if !defined(__QNX__) && !defined(__BEOS__) && !defined(WIN32)
|
||||
# define HAVE_UNIX_SOCKETS 1
|
||||
#endif
|
||||
|
||||
|
|
|
@ -0,0 +1,93 @@
|
|||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* port.h
|
||||
* Header for /port compatibility functions.
|
||||
*
|
||||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: port.h,v 1.1 2003/05/15 16:35:29 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/* Portable path handling for Unix/Win32 */
|
||||
bool is_absolute_path(const char *filename);
|
||||
char *first_path_separator(const char *filename);
|
||||
char *last_path_separator(const char *filename);
|
||||
char *get_progname(char *argv0);
|
||||
|
||||
#if defined(bsdi) || defined(netbsd)
|
||||
int fseeko(FILE *stream, off_t offset, int whence);
|
||||
off_t ftello(FILE *stream);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Win32 doesn't have reliable rename/unlink during concurrent access
|
||||
*/
|
||||
#if defined(WIN32) && !defined(FRONTEND)
|
||||
int pgrename(const char *from, const char *to);
|
||||
int pgunlink(const char *path);
|
||||
#define rename(from, to) pgrename(from, to)
|
||||
#define unlink(path) pgunlink(path)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Win32 requires a special close for sockets and pipes, while on Unix
|
||||
* close() does them all.
|
||||
*/
|
||||
#ifndef WIN32
|
||||
#define closesocket close
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Default "extern" declarations or macro substitutes for library routines.
|
||||
* When necessary, these routines are provided by files in src/port/.
|
||||
*/
|
||||
#ifndef HAVE_CRYPT
|
||||
char *crypt(const char *key, const char *setting);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_FSEEKO
|
||||
#define fseeko(a, b, c) fseek((a), (b), (c))
|
||||
#define ftello(a) ftell((a))
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_GETOPT
|
||||
extern int getopt(int nargc, char *const *nargv, const char *ostr);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_ISINF
|
||||
extern int isinf(double x);
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_GETHOSTNAME) && defined(KRB4)
|
||||
extern int gethostname(char *name, int namelen);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_RINT
|
||||
extern double rint(double x);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_INET_ATON
|
||||
# include <netinet/in.h>
|
||||
# include <arpa/inet.h>
|
||||
extern int inet_aton(const char *cp, struct in_addr * addr);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRCASECMP
|
||||
extern int strcasecmp(char *s1, char *s2);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRDUP
|
||||
extern char *strdup(char const *);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_RANDOM
|
||||
extern long random(void);
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_SRANDOM
|
||||
extern void srandom(unsigned int seed);
|
||||
#endif
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
/* $Header: /cvsroot/pgsql/src/include/port/Attic/win.h,v 1.15 2003/03/21 17:18:34 petere Exp $ */
|
||||
|
||||
#define HAS_TEST_AND_SET
|
||||
|
||||
#ifdef BUILDING_DLL
|
||||
#define DLLIMPORT __declspec (dllexport)
|
||||
#else
|
||||
#define DLLIMPORT __declspec (dllimport)
|
||||
#endif
|
||||
|
||||
#if defined(_DLL)
|
||||
#define DLLIMPORT __declspec (dllexport)
|
||||
#else
|
||||
#define DLLIMPORT __declspec (dllimport)
|
||||
#endif
|
|
@ -1,4 +1,15 @@
|
|||
/* $Header: /cvsroot/pgsql/src/include/port/win32.h,v 1.9 2003/04/29 18:25:54 momjian Exp $ */
|
||||
/* $Header: /cvsroot/pgsql/src/include/port/win32.h,v 1.10 2003/05/15 16:35:29 momjian Exp $ */
|
||||
|
||||
/* undefine and redefine after #include */
|
||||
#undef mkdir
|
||||
|
||||
#undef ERROR
|
||||
#include <windows.h>
|
||||
#undef near
|
||||
|
||||
/* Must be here to avoid conflicting with prototype in windows.h */
|
||||
#define mkdir(a,b) mkdir(a)
|
||||
|
||||
|
||||
#define USES_WINSOCK
|
||||
#define NOFILE 100
|
||||
|
@ -33,6 +44,9 @@
|
|||
/*
|
||||
* IPC defines
|
||||
*/
|
||||
#undef HAVE_UNION_SEMUN
|
||||
#define HAVE_UNION_SEMUN 1
|
||||
|
||||
#define IPC_RMID 256
|
||||
#define IPC_CREAT 512
|
||||
#define IPC_EXCL 1024
|
||||
|
@ -40,6 +54,14 @@
|
|||
#define IPC_NOWAIT 2048
|
||||
#define IPC_STAT 4096
|
||||
|
||||
#define EACCESS 2048
|
||||
#define EIDRM 4096
|
||||
|
||||
#define SETALL 8192
|
||||
#define GETNCNT 16384
|
||||
#define GETVAL 65536
|
||||
#define SETVAL 131072
|
||||
#define GETPID 262144
|
||||
|
||||
/*
|
||||
* Shared memory
|
||||
|
@ -77,6 +99,30 @@ int semctl(int semId, int semNum, int flag, union semun);
|
|||
int semget(int semKey, int semNum, int flags);
|
||||
int semop(int semId, struct sembuf * sops, int flag);
|
||||
|
||||
#define sleep(sec) (Sleep(sec * 1000), /* no return value */ 0)
|
||||
|
||||
/* Some extra signals */
|
||||
#define SIGHUP 1
|
||||
#define SIGQUIT 3
|
||||
#define SIGTRAP 5
|
||||
#define SIGABRT 22 /* Set to match W32 value -- not UNIX value */
|
||||
#define SIGKILL 9
|
||||
#define SIGPIPE 13
|
||||
#define SIGALRM 14
|
||||
#define SIGSTOP 17
|
||||
#define SIGCONT 19
|
||||
#define SIGCHLD 20
|
||||
#define SIGTTIN 21
|
||||
#define SIGTTOU 22 /* Same as SIGABRT -- no problem, I hope */
|
||||
#define SIGWINCH 28
|
||||
#define SIGUSR1 30
|
||||
#define SIGUSR2 31
|
||||
|
||||
struct timezone
|
||||
{
|
||||
int tz_minuteswest; /* Minutes west of GMT. */
|
||||
int tz_dsttime; /* Nonzero if DST is ever in effect. */
|
||||
};
|
||||
|
||||
/* FROM SRA */
|
||||
|
||||
|
@ -130,5 +176,3 @@ extern double rint(double x);
|
|||
*/
|
||||
#define snprintf _snprintf
|
||||
#define vsnprintf _vsnprintf
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
#include <sys/socket.h>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
/*
|
||||
* Unfortunately, <wingdi.h> of VC++ also defines ERROR.
|
||||
* To avoid the conflict, we include <windows.h> here and undefine ERROR
|
||||
* immediately.
|
||||
*
|
||||
* Note: Don't include <wingdi.h> directly. It causes compile errors.
|
||||
*/
|
||||
#include <winsock2.h>
|
||||
#undef ERROR
|
||||
#undef small
|
||||
|
||||
/* Restore old ERROR value */
|
||||
#ifdef PGERROR
|
||||
#define ERROR PGERROR
|
||||
#endif
|
|
@ -7,7 +7,7 @@
|
|||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: rusagestub.h,v 1.10 2002/06/20 20:29:42 momjian Exp $
|
||||
* $Id: rusagestub.h,v 1.11 2003/05/15 16:35:29 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -15,7 +15,9 @@
|
|||
#define RUSAGESTUB_H
|
||||
|
||||
#include <sys/time.h> /* for struct timeval */
|
||||
#ifndef WIN32
|
||||
#include <sys/times.h> /* for struct tms */
|
||||
#endif
|
||||
#include <limits.h> /* for CLK_TCK */
|
||||
|
||||
#define RUSAGE_SELF 0
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: elog.h,v 1.41 2003/04/24 21:16:44 tgl Exp $
|
||||
* $Id: elog.h,v 1.42 2003/05/15 16:35:29 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -35,6 +35,15 @@
|
|||
#define WARNING 19 /* Warnings */
|
||||
#define ERROR 20 /* user error - abort transaction; return
|
||||
* to known state */
|
||||
#define ERROR 20 /* user error - abort transaction; return
|
||||
* to known state */
|
||||
/* Save ERROR value in PGERROR so it can bve restored when Win32 includes
|
||||
* modify it. We have to use a constant rather than ERROR because macros
|
||||
* are expanded only when referenced outside macros.
|
||||
*/
|
||||
#ifdef WIN32
|
||||
#define PGERROR 20
|
||||
#endif
|
||||
#define FATAL 21 /* fatal error - abort process */
|
||||
#define PANIC 22 /* take down the other backends with me */
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
* exceed INITIAL_EXPBUFFER_SIZE (currently 256 bytes).
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-auth.c,v 1.76 2003/04/19 00:02:30 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-auth.c,v 1.77 2003/05/15 16:35:30 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -386,10 +386,10 @@ pg_krb5_sendauth(char *PQerrormsg, int sock,
|
|||
/*
|
||||
* libpq uses a non-blocking socket. But kerberos needs a blocking
|
||||
* socket, and we have to block somehow to do mutual authentication
|
||||
* anyway. So we temporarily make it blocking.
|
||||
* anyway. So we temporarily make it blocking. Win32 doesn't support this.
|
||||
*/
|
||||
flags = fcntl(sock, F_GETFL);
|
||||
if (flags < 0 || fcntl(sock, F_SETFL, (long) (flags & ~O_NONBLOCK)))
|
||||
if (flags < 0 || fcntl(sock, F_SETFL, flags & ~O_NONBLOCK)))
|
||||
{
|
||||
snprintf(PQerrormsg, PQERRORMSG_LENGTH,
|
||||
libpq_gettext("could not set socket to blocking mode: %s\n"), strerror(errno));
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.240 2003/05/05 00:44:56 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.241 2003/05/15 16:35:30 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -719,17 +719,7 @@ update_db_info(PGconn *conn)
|
|||
static int
|
||||
connectMakeNonblocking(PGconn *conn)
|
||||
{
|
||||
#if defined(WIN32) || defined(__BEOS__)
|
||||
int on = 1;
|
||||
#endif
|
||||
|
||||
#if defined(WIN32)
|
||||
if (ioctlsocket(conn->sock, FIONBIO, &on) != 0)
|
||||
#elif defined(__BEOS__)
|
||||
if (ioctl(conn->sock, FIONBIO, &on) != 0)
|
||||
#else
|
||||
if (fcntl(conn->sock, F_SETFL, O_NONBLOCK) < 0)
|
||||
#endif
|
||||
if (FCNTL_NONBLOCK(conn->sock) < 0)
|
||||
{
|
||||
printfPQExpBuffer(&conn->errorMessage,
|
||||
libpq_gettext("could not set socket to non-blocking mode: %s\n"),
|
||||
|
|
|
@ -1,4 +1,8 @@
|
|||
# $Header: /cvsroot/pgsql/src/makefiles/Attic/Makefile.win,v 1.19 2003/03/21 17:18:34 petere Exp $
|
||||
# $Header: /cvsroot/pgsql/src/makefiles/Makefile.win32,v 1.1 2003/05/15 16:35:30 momjian Exp $
|
||||
|
||||
# Use replacement include files for those missing on Win32
|
||||
override CPPFLAGS+="-I$(top_srcdir)/src/include/port/win32_include"
|
||||
|
||||
DLLTOOL= dlltool
|
||||
DLLWRAP= dllwrap
|
||||
BE_DLLLIBS= -L$(top_builddir)/src/backend -lpostgres
|
|
@ -6,6 +6,8 @@
|
|||
|
||||
#ifndef TEST_VERSION
|
||||
|
||||
#include "postgres.h"
|
||||
|
||||
#undef rename
|
||||
#undef unlink
|
||||
|
||||
|
|
|
@ -30,9 +30,11 @@
|
|||
* 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.
|
||||
*/
|
||||
|
||||
#include "postgres.h"
|
||||
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
@ -92,7 +94,7 @@ const char *ostr;
|
|||
++optind;
|
||||
if (opterr && *ostr != ':')
|
||||
(void) fprintf(stderr,
|
||||
"%s: illegal option -- %c\n", argv[0], optopt);
|
||||
"illegal option -- %c\n", optopt);
|
||||
return BADCH;
|
||||
}
|
||||
if (*++oli != ':')
|
||||
|
@ -112,8 +114,8 @@ const char *ostr;
|
|||
return BADARG;
|
||||
if (opterr)
|
||||
(void) fprintf(stderr,
|
||||
"%s: option requires an argument -- %c\n",
|
||||
argv[0], optopt);
|
||||
"option requires an argument -- %c\n",
|
||||
optopt);
|
||||
return BADCH;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
/* $Id: getrusage.c,v 1.1 2002/07/18 04:13:59 momjian Exp $ */
|
||||
/* $Id: getrusage.c,v 1.2 2003/05/15 16:35:30 momjian Exp $ */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "postgres.h"
|
||||
#include "rusagestub.h"
|
||||
|
||||
/* This code works on:
|
||||
|
@ -19,6 +21,10 @@
|
|||
int
|
||||
getrusage(int who, struct rusage * rusage)
|
||||
{
|
||||
#ifdef WIN32
|
||||
if (rusage)
|
||||
memset(rusage, 0, sizeof(rusage));
|
||||
#else
|
||||
struct tms tms;
|
||||
int tick_rate = CLK_TCK; /* ticks per second */
|
||||
clock_t u,
|
||||
|
@ -54,5 +60,6 @@ getrusage(int who, struct rusage * rusage)
|
|||
rusage->ru_utime.tv_usec = TICK_TO_USEC(u, tick_rate);
|
||||
rusage->ru_stime.tv_sec = TICK_TO_SEC(s, tick_rate);
|
||||
rusage->ru_stime.tv_usec = TICK_TO_USEC(u, tick_rate);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1,122 +0,0 @@
|
|||
/*
|
||||
* $Header: /cvsroot/pgsql/src/port/Attic/opendir.c,v 1.1 2003/05/09 01:16:29 momjian Exp $
|
||||
*
|
||||
* Copyright (c) 2003 SRA, Inc.
|
||||
* Copyright (c) 2003 SKC, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software and
|
||||
* its documentation for any purpose, without fee, and without a
|
||||
* written agreement is hereby granted, provided that the above
|
||||
* copyright notice and this paragraph and the following two
|
||||
* paragraphs appear in all copies.
|
||||
*
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT,
|
||||
* INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING
|
||||
* LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS
|
||||
* DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS
|
||||
* IS" BASIS, AND THE AUTHOR HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE,
|
||||
* SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
*/
|
||||
|
||||
#include "postgres.h"
|
||||
|
||||
#include <stddef.h>
|
||||
#include <sys/types.h>
|
||||
#include <windows.h>
|
||||
|
||||
#include "dirent.h"
|
||||
|
||||
DIR *
|
||||
opendir(const char *dir)
|
||||
{
|
||||
DIR *dp;
|
||||
char *findspec;
|
||||
HANDLE handle;
|
||||
size_t dirlen;
|
||||
|
||||
dirlen = strlen(dir);
|
||||
findspec = palloc(dirlen + 2 + 1);
|
||||
if (findspec == NULL)
|
||||
return NULL;
|
||||
|
||||
if (dirlen == 0)
|
||||
strcpy(findspec, "*");
|
||||
else if (isalpha(dir[0]) && dir[1] == ':' && dir[2] == '\0')
|
||||
sprintf(findspec, "%s*", dir);
|
||||
else if (dir[dirlen - 1] == '/' || dir[dirlen - 1] == '\\')
|
||||
sprintf(findspec, "%s*", dir);
|
||||
else
|
||||
sprintf(findspec, "%s\\*", dir);
|
||||
|
||||
dp = (DIR *)palloc(sizeof(DIR));
|
||||
if (dp == NULL)
|
||||
{
|
||||
pfree(findspec);
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dp->offset = 0;
|
||||
dp->finished = 0;
|
||||
dp->dir = pstrdup(dir);
|
||||
if (dp->dir == NULL)
|
||||
{
|
||||
pfree(dp);
|
||||
pfree(findspec);
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
handle = FindFirstFile(findspec, &(dp->finddata));
|
||||
if (handle == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
pfree(dp->dir);
|
||||
pfree(dp);
|
||||
pfree(findspec);
|
||||
errno = ENOENT;
|
||||
return NULL;
|
||||
}
|
||||
dp->handle = handle;
|
||||
|
||||
pfree(findspec);
|
||||
return dp;
|
||||
}
|
||||
|
||||
|
||||
struct dirent *
|
||||
readdir(DIR *dp)
|
||||
{
|
||||
if (dp == NULL || dp->finished)
|
||||
return NULL;
|
||||
|
||||
if (dp->offset != 0)
|
||||
{
|
||||
if (FindNextFile(dp->handle, &(dp->finddata)) == 0)
|
||||
{
|
||||
dp->finished = 1;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
dp->offset++;
|
||||
|
||||
strncpy(dp->ent.d_name, dp->finddata.cFileName, MAX_PATH);
|
||||
dp->ent.d_ino = 1;
|
||||
|
||||
return &(dp->ent);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
closedir(DIR *dp)
|
||||
{
|
||||
FindClose(dp->handle);
|
||||
pfree(dp->dir);
|
||||
pfree(dp);
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
if test "$GCC" = yes; then
|
||||
CFLAGS="-O2"
|
||||
fi
|
Loading…
Reference in New Issue