diff options
Diffstat (limited to 'lib/base')
-rw-r--r-- | lib/base/Makefile | 37 | ||||
-rw-r--r-- | lib/base/crit.cpp | 22 | ||||
-rw-r--r-- | lib/base/dns.cpp | 38 | ||||
-rw-r--r-- | lib/base/dnsdmain.cpp | 2 | ||||
-rw-r--r-- | lib/base/ereport.cpp | 227 | ||||
-rw-r--r-- | lib/base/eventlog.cpp | 1 | ||||
-rw-r--r-- | lib/base/file.cpp | 1 | ||||
-rw-r--r-- | lib/base/lexer.cpp | 12 | ||||
-rw-r--r-- | lib/base/net.cpp | 516 | ||||
-rw-r--r-- | lib/base/plist_pvt.h | 3 | ||||
-rw-r--r-- | lib/base/pool.cpp | 34 | ||||
-rw-r--r-- | lib/base/system.cpp | 11 | ||||
-rw-r--r-- | lib/base/systhr.cpp | 1 | ||||
-rw-r--r-- | lib/base/util.cpp | 977 |
14 files changed, 46 insertions, 1836 deletions
diff --git a/lib/base/Makefile b/lib/base/Makefile index d646be03..6676436a 100644 --- a/lib/base/Makefile +++ b/lib/base/Makefile @@ -38,62 +38,33 @@ $(OBJDEST): mkdir -p $(OBJDEST) ifeq ($(ARCH), WINNT) -OSOBJS = nterrors.o eventlog.o eventhandler.o ntpipe.o pathnames.o +OSOBJS = nterrors.o eventlog.o else OSOBJS = endif OBJS = $(addprefix $(OBJDEST)/, \ - dstats.o \ - daemon.o \ shexp.o \ - regexp.o \ - pblock.o \ plist.o \ - buffer.o \ - netbuf.o \ file.o \ - net.o \ - session.o \ - cinfo.o \ util.o \ - ereport.o \ - sem.o \ + net.o \ fsmutex.o \ systhr.o \ crit.o \ rwlock.o \ dns.o \ dnsdmain.o \ - shmem.o \ - dll.o \ - servssl.o \ lexer.o \ - restart.o \ - objndx.o \ - cache.o \ pool.o \ - time_cache.o \ - dns_cache.o \ system.o \ - xp.o \ nscperror.o \ - language.o \ - fasttime.o \ - secpwd.o \ + ereport.o \ $(OSOBJS) \ ) -MODULE_CFLAGS=-I$(BUILD_ROOT)/include/base - -ifeq ($(PRODUCT),"Netscape Catalog Server") -ifeq ($(ARCH), WINNT) -MCC_INCLUDE := $(subst -I$(BUILD_ROOT)/lib/libnet,,$(MCC_INCLUDE)) -endif -endif -#$(OBJDEST)/fasttime.o : $(OBJDIR)/fasttime.o -# cp $< $@ +MODULE_CFLAGS=-I$(BUILD_ROOT)/include/base -I$(BUILD_ROOT)/ldap/servers/slapd $(LIBS): $(OBJS) rm -f $@ diff --git a/lib/base/crit.cpp b/lib/base/crit.cpp index 06f5fba4..ceb9a634 100644 --- a/lib/base/crit.cpp +++ b/lib/base/crit.cpp @@ -18,7 +18,6 @@ #include "netsite.h" #include "crit.h" #include "pool.h" -#include "ereport.h" #include "base/dbtbase.h" @@ -29,13 +28,6 @@ */ #include "nspr.h" -/* private/primpl.h is gone fromnspr21 19971028 */ -#if 0 -#ifdef XP_WIN32 -#include "private/primpl.h" -#endif /* XP_WIN32 */ -#endif - #include "prthread.h" #include "prlock.h" #include "prcvar.h" @@ -97,12 +89,12 @@ NSAPI_PUBLIC void crit_enter(CRITICAL id) PRThread *me = PR_GetCurrentThread(); if ( crit->owner == me) { - NS_ASSERT(crit->count > 0); + PR_ASSERT(crit->count > 0); crit->count++; } else { PR_Lock(crit->lock); - NS_ASSERT(crit->count == 0); + PR_ASSERT(crit->count == 0); crit->count = 1; crit->owner = me; } @@ -121,7 +113,7 @@ NSAPI_PUBLIC void crit_exit(CRITICAL id) crit->owner = 0; PR_Unlock(crit->lock); } - NS_ASSERT(crit->count >= 0); + PR_ASSERT(crit->count >= 0); #endif } @@ -165,7 +157,7 @@ NSAPI_PUBLIC void condvar_wait(CONDVAR _cv) int saveCount = cv->lock->count; PRThread *saveOwner = cv->lock->owner; - NS_ASSERT(cv->lock->owner == PR_GetCurrentThread()); + PR_ASSERT(cv->lock->owner == PR_GetCurrentThread()); cv->lock->count = 0; cv->lock->owner = 0; @@ -185,7 +177,7 @@ NSAPI_PUBLIC void condvar_timed_wait(CONDVAR _cv, long secs) int saveCount = cv->lock->count; PRThread *saveOwner = cv->lock->owner; - NS_ASSERT(cv->lock->owner == PR_GetCurrentThread()); + PR_ASSERT(cv->lock->owner == PR_GetCurrentThread()); cv->lock->count = 0; cv->lock->owner = 0; @@ -205,7 +197,7 @@ NSAPI_PUBLIC void condvar_notify(CONDVAR _cv) { #ifdef USE_NSPR condvar_t *cv = (condvar_t *)_cv; - NS_ASSERT(cv->lock->owner == PR_GetCurrentThread()); + PR_ASSERT(cv->lock->owner == PR_GetCurrentThread()); PR_NotifyCondVar(cv->cvar); #endif } @@ -214,7 +206,7 @@ NSAPI_PUBLIC void condvar_notifyAll(CONDVAR _cv) { #ifdef USE_NSPR condvar_t *cv = (condvar_t *)_cv; - NS_ASSERT(cv->lock->owner == PR_GetCurrentThread()); + PR_ASSERT(cv->lock->owner == PR_GetCurrentThread()); PR_NotifyAllCondVar(cv->cvar); #endif } diff --git a/lib/base/dns.cpp b/lib/base/dns.cpp index f9e38886..3760cac5 100644 --- a/lib/base/dns.cpp +++ b/lib/base/dns.cpp @@ -17,8 +17,6 @@ #include "base/systems.h" #endif /* XP_WIN32 */ -#include "net.h" /* SYS_NETFD, various headers to do DNS */ - /* Under NT, these are taken care of by net.h including winsock.h */ #ifdef XP_UNIX #include <arpa/inet.h> /* inet_ntoa */ @@ -27,13 +25,8 @@ extern "C" int gethostname (char *name, size_t namelen); #endif #endif -#ifdef DNS_CACHE -#include "base/dns_cache.h" -#include "base/ereport.h" -#endif /* DNS_CACHE */ #include <stdio.h> #include <nspr.h> -#include "frame/conf.h" /* ---------------------------- dns_find_fqdn ----------------------------- */ @@ -75,9 +68,6 @@ char *dns_ip2host(char *ip, int verify) /* struct in_addr iaddr; */ PRNetAddr iaddr; char *hn; -#ifdef DNS_CACHE - dns_cache_entry_t *dns_entry; -#endif static unsigned long laddr = 0; static char myhostname[256]; PRHostEnt hent; @@ -90,23 +80,6 @@ char *dns_ip2host(char *ip, int verify) if((iaddr.inet.ip = inet_addr(ip)) == -1) goto bong; -#ifdef DNS_CACHE - if ( (dns_entry = dns_cache_lookup_ip((unsigned int)iaddr.inet.ip)) ) { - hn = NULL; - if ( dns_entry->host && - /* Only use entry if the cache entry has been verified or if - * verify is off... - */ - (dns_entry->verified || !verify) ) { - hn = STRDUP( dns_entry->host ); - (void)dns_cache_use_decrement(dns_entry); - return hn; - } - dns_cache_delete(dns_entry); - dns_entry = 0; - } -#endif - /* * See if it happens to be the localhost IP address, and try * the local host name if so. @@ -159,18 +132,7 @@ char *dns_ip2host(char *ip, int verify) goto bong; } -#ifdef DNS_CACHE - if ( (dns_entry = dns_cache_insert(hn, (unsigned int)iaddr.inet.ip, verify)) ) { - (void) dns_cache_use_decrement(dns_entry); - } -#endif /* DNS_CACHE */ return hn; bong: -#ifdef DNS_CACHE - /* Insert the lookup failure */ - if ( (dns_entry = dns_cache_insert(NULL, (unsigned int)iaddr.inet.ip, verify)) ) { - (void) dns_cache_use_decrement(dns_entry); - } -#endif /* DNS_CACHE */ return NULL; } diff --git a/lib/base/dnsdmain.cpp b/lib/base/dnsdmain.cpp index f37e475c..6972dcb5 100644 --- a/lib/base/dnsdmain.cpp +++ b/lib/base/dnsdmain.cpp @@ -10,7 +10,6 @@ #include "netsite.h" -#include "base/net.h" #include <string.h> #include <stdio.h> #ifdef XP_UNIX @@ -26,7 +25,6 @@ extern "C" { #include <nspr.h> } -#include "frame/conf.h" diff --git a/lib/base/ereport.cpp b/lib/base/ereport.cpp index 3454d01f..e7acad19 100644 --- a/lib/base/ereport.cpp +++ b/lib/base/ereport.cpp @@ -13,10 +13,9 @@ #include "private/pprio.h" /* for nspr20 binary release */ #include "netsite.h" #include "file.h" /* system_fopenWA, system_write_atomic */ -#include "pblock.h" -#include "session.h" #include "util.h" /* util_vsprintf */ #include "ereport.h" +#include "slapi-plugin.h" #include "base/dbtbase.h" @@ -25,217 +24,33 @@ #include <string.h> /* strcpy */ #include <time.h> /* localtime */ -#ifdef XP_UNIX -#include <syslog.h> /* error logging to syslog */ - -static SYS_FILE _error_fd; -#else /* WIN32 */ -#include <nt/regparms.h> -#include <nt/messages.h> -#include "eventlog.h" - -static SYS_FILE _error_fd; -#endif /* XP_UNIX */ - -static PRBool _ereport_initialized = PR_FALSE; - - -NSAPI_PUBLIC SYS_FILE ereport_getfd(void) { return _error_fd; } - - - -/* ----------------------------- ereport_init ----------------------------- */ - - -NSAPI_PUBLIC char *ereport_init(char *err_fn, char *email, - PASSWD pwuser, char *version) -{ - char err[MAGNUS_ERROR_LEN]; - SYS_FILE new_fd; - -#ifdef XP_UNIX - if(!strcmp(err_fn, "SYSLOG")) { -#ifdef NET_SSL - openlog("secure-httpd", LOG_PID, LOG_DAEMON); -#else - openlog("httpd", LOG_PID, LOG_DAEMON); -#endif - _error_fd = PR_ImportFile(ERRORS_TO_SYSLOG); - - _ereport_initialized = PR_TRUE; - return NULL; - } -#endif /* XP_UNIX */ - if( (new_fd = system_fopenWA(err_fn)) == SYS_ERROR_FD) { - util_snprintf(err, MAGNUS_ERROR_LEN, "can't open error log %s (%s)", err_fn, - system_errmsg()); -#ifdef XP_UNIX - _error_fd = PR_ImportFile(STDERR_FILENO); -#else - _error_fd = PR_ImportFile(NULL); -#endif - return STRDUP(err); - } - _error_fd = new_fd; - -#ifdef XP_UNIX - if(pwuser) - chown(err_fn, pwuser->pw_uid, pwuser->pw_gid); -#endif /* XP_UNIX */ - - _ereport_initialized = PR_TRUE; - - ereport(LOG_INFORM, XP_GetAdminStr(DBT_successfulServerStartup_)); - ereport(LOG_INFORM, XP_GetAdminStr(DBT_SBS_), MAGNUS_VERSION_STRING, BUILD_NUM); - if (strcasecmp(BUILD_NUM, version)) { - ereport(LOG_WARN, XP_GetAdminStr(DBT_netscapeExecutableAndSharedLibra_)); - ereport(LOG_WARN, XP_GetAdminStr(DBT_executableVersionIsS_), version); - ereport(LOG_WARN, XP_GetAdminStr(DBT_sharedLibraryVersionIsS_), BUILD_NUM); - - } - - /* Initialize thread-specific error handling */ - system_errmsg_init(); - - return NULL; -} - - - -/* -------------------------- ereport_terminate --------------------------- */ - - -NSAPI_PUBLIC void ereport_terminate(void) -{ - if (!_ereport_initialized) - return; - -#ifdef XP_UNIX - ereport(LOG_INFORM, XP_GetAdminStr(DBT_errorReportingShuttingDown_)); - if(PR_FileDesc2NativeHandle(_error_fd) != ERRORS_TO_SYSLOG) - system_fclose(_error_fd); - else - closelog(); -#else /* WIN32 */ - if(PR_FileDesc2NativeHandle(_error_fd) != NULL) - system_fclose(_error_fd); -#endif /* XP_UNIX */ - -} - - -/* ------------------------------- ereport -------------------------------- */ - - -static int degree_msg[] = { - DBT_warning_, - DBT_config_, - DBT_security_, - DBT_failure_, - DBT_catastrophe_, - DBT_info_, - DBT_verbose_ - }; - -#ifdef XP_UNIX -static int degree_syslog[] = { - LOG_WARNING, LOG_ERR, LOG_NOTICE, LOG_ALERT, LOG_CRIT, LOG_INFO, LOG_INFO -}; -#endif/* XP_UNIX */ - +/* taken from ACL plugin acl.h */ +#define ACL_PLUGIN_NAME "NSACLPlugin" NSAPI_PUBLIC int ereport_v(int degree, char *fmt, va_list args) { char errstr[MAX_ERROR_LEN]; - int pos = 0; - struct tm *tms, tmss; - time_t t; -#ifdef MCC_PROXY - char *p; - int i; -#endif /* MCC_PROXY */ - if (!_ereport_initialized) - return IO_OKAY; - -#ifdef XP_UNIX - if(PR_FileDesc2NativeHandle(_error_fd) != ERRORS_TO_SYSLOG) { -#endif /* XP_UNIX */ - t = time(NULL); - tms = system_localtime(&t, &tmss); - util_strftime(errstr, ERR_TIMEFMT, tms); - pos = strlen(errstr); - - pos += util_snprintf(&errstr[pos], MAX_ERROR_LEN - pos, " %s: ", - XP_GetAdminStr(degree_msg[degree])); -#ifdef XP_UNIX + util_vsnprintf(errstr, MAX_ERROR_LEN, fmt, args); + switch (degree) + { + case LOG_WARN: + case LOG_FAILURE: + case LOG_INFORM: + case LOG_VERBOSE: + case LOG_MISCONFIG: +// slapi_log_error(SLAPI_LOG_PLUGIN, ACL_PLUGIN_NAME, errstr); + break; + case LOG_SECURITY: +// slapi_log_error(SLAPI_LOG_ACL, ACL_PLUGIN_NAME, errstr); + break; + case LOG_CATASTROPHE: +// slapi_log_error(SLAPI_LOG_FATAL, ACL_PLUGIN_NAME, errstr); + break; + default: + break; } -#endif /* XP_UNIX */ - - pos += util_vsnprintf(&errstr[pos], sizeof(errstr) - pos, fmt, args); - - pos += util_snprintf(&errstr[pos], sizeof(errstr) - pos, ENDLINE); - -#ifdef MCC_PROXY - /* Thanx to netlib, the proxy sometimes generates multiline err msgs */ - for(p=errstr, i=pos-1; i>0; i--, p++) { - if (*p == '\n' || *p == '\r') *p = ' '; - } -#endif /* MCC_PROXY */ - -#if defined XP_UNIX - if(PR_FileDesc2NativeHandle(_error_fd) != ERRORS_TO_SYSLOG) - return system_fwrite_atomic(_error_fd, errstr, pos); - syslog(degree_syslog[degree], errstr); return IO_OKAY; -#elif defined XP_WIN32 /* XP_WIN32 */ - if(PR_FileDesc2NativeHandle(_error_fd) != NULL) - { -#ifdef MCC_HTTPD - /* also write to NT Event Log if error is serious */ - switch (degree) - { - case LOG_MISCONFIG: - case LOG_SECURITY: - case LOG_CATASTROPHE: - LogErrorEvent(NULL, EVENTLOG_ERROR_TYPE, - 0, MSG_BAD_PARAMETER, - errstr, NULL); - break; - default: - break; - } -#endif - return system_fwrite_atomic(_error_fd, errstr, pos); - } - else { /* log to the EventLogger */ - /* Write to the event logger... */ - switch (degree) { - case LOG_WARN: - LogErrorEvent(NULL, EVENTLOG_WARNING_TYPE, - 0, MSG_BAD_PARAMETER, - errstr, NULL); - break; - case LOG_MISCONFIG: - case LOG_SECURITY: - case LOG_FAILURE: - case LOG_CATASTROPHE: - LogErrorEvent(NULL, EVENTLOG_ERROR_TYPE, - 0, MSG_BAD_PARAMETER, - errstr, NULL); - break; - - case LOG_INFORM: - default: - LogErrorEvent(NULL, EVENTLOG_INFORMATION_TYPE, - 0, MSG_BAD_PARAMETER, - errstr, NULL); - break; - } - return (IO_OKAY); - } -#endif /* XP_WIN32 */ - } NSAPI_PUBLIC int ereport(int degree, char *fmt, ...) diff --git a/lib/base/eventlog.cpp b/lib/base/eventlog.cpp index b8762842..26149c1a 100644 --- a/lib/base/eventlog.cpp +++ b/lib/base/eventlog.cpp @@ -22,7 +22,6 @@ #include <stdlib.h> #include "netsite.h" #include "base/eventlog.h" -#include "frame/conf.h" #include <nt/regparms.h> #include <nt/messages.h> diff --git a/lib/base/file.cpp b/lib/base/file.cpp index 7382be46..0833cde5 100644 --- a/lib/base/file.cpp +++ b/lib/base/file.cpp @@ -13,7 +13,6 @@ #include "base/file.h" -#include "ereport.h" #ifdef BSD_RLIMIT #include <sys/time.h> #include <sys/resource.h> diff --git a/lib/base/lexer.cpp b/lib/base/lexer.cpp index e521c51f..18327d0a 100644 --- a/lib/base/lexer.cpp +++ b/lib/base/lexer.cpp @@ -13,7 +13,7 @@ */ #include "netsite.h" -#include "base/nsassert.h" +#include "prlog.h" #include "lexer_pvt.h" #include "base/lexer.h" @@ -104,7 +104,7 @@ int lex_class_create(int classc, char * classv[], void **pchtab) int i; /* class index */ /* Get number of bytes per bit vector */ - NS_ASSERT(classc > 0); + PR_ASSERT(classc > 0); bvbytes = (classc + 7) >> 3; /* Allocate the character class table */ @@ -137,7 +137,7 @@ int lex_class_create(int classc, char * classv[], void **pchtab) } /* Return pointer to table */ - NS_ASSERT(pchtab != NULL); + PR_ASSERT(pchtab != NULL); *pchtab = (void *)ct; return classc; @@ -273,7 +273,7 @@ int lex_token_new(pool_handle_t * pool, int initlen, int growlen, void **token) if (growlen > 0) lt->lt_inclen = growlen; - NS_ASSERT(token != NULL); + PR_ASSERT(token != NULL); *token = (void *)lt; return 0; @@ -533,8 +533,8 @@ int lex_token_append(void * token, int nbytes, char * src) int bufsize; int length; - NS_ASSERT(nbytes >= 0); - NS_ASSERT((src != NULL) || (nbytes == 0)); + PR_ASSERT(nbytes >= 0); + PR_ASSERT((src != NULL) || (nbytes == 0)); if (nbytes > 0) { diff --git a/lib/base/net.cpp b/lib/base/net.cpp index 0d15b121..1ccfdbd7 100644 --- a/lib/base/net.cpp +++ b/lib/base/net.cpp @@ -14,19 +14,9 @@ #include "netsite.h" -#include "prio.h" -#include "private/pprio.h" #include <nspr.h> -#include <frame/conf.h> -/* Removed for ns security integration -#include "sslio/sslio.h" -*/ - -#include "net.h" #include "util.h" -#include "daemon.h" /* child_exit */ -#include "ereport.h" /* error reporting */ #include <string.h> #ifdef XP_UNIX #include <arpa/inet.h> /* inet_ntoa */ @@ -39,521 +29,18 @@ extern "C" int gethostname (char *name, size_t namelen); #include <sys/ioctl.h> /* ioctl */ #endif -extern "C" { -#include "ssl.h" -} - -#if defined(OSF1) -#include <stropts.h> -#endif -#include "base/systems.h" -#include "base/dbtbase.h" - -#if defined(OSF1) -#include <stropts.h> -#endif - -#ifdef IRIX -#include <bstring.h> /* fd_zero uses bzero */ -#endif -#include "netio.h" - -net_io_t net_io_functions; -/* removed for ns security integration -#include "xp_error.h" -*/ - #include "libadmin/libadmin.h" -int net_enabledns = 1; -int net_enableAsyncDNS = 0; -int net_listenqsize = DAEMON_LISTEN_SIZE; -unsigned int NET_BUFFERSIZE = NET_DEFAULT_BUFFERSIZE; -unsigned int NET_READ_TIMEOUT = NET_DEFAULT_READ_TIMEOUT; -unsigned int NET_WRITE_TIMEOUT = NET_DEFAULT_WRITE_TIMEOUT; -unsigned int SSL_HANDSHAKE_TIMEOUT = SSL_DEFAULT_HANDSHAKE_TIMEOUT; - - -/* ------------------------------ net_init -------------------------------- */ -NSAPI_PUBLIC int net_init(int security_on) -{ - return 0; -} - -/* ------------------------------ net_socket ------------------------------ */ -NSAPI_PUBLIC SYS_NETFD net_socket(int domain, int type, int protocol) -{ - SYS_NETFD sock; - SYS_NETFD prsock; - - if (security_active) { - if (protocol == IPPROTO_TCP) - prsock = PR_NewTCPSocket(); - else - prsock = PR_NewUDPSocket(); - if(prsock) - sock = SSL_ImportFD(NULL, prsock); - else sock = NULL; - } - else { - if (protocol == IPPROTO_TCP) sock = PR_NewTCPSocket(); - else sock = PR_NewUDPSocket(); - } - - if (sock == NULL) - return (SYS_NETFD)SYS_NET_ERRORFD; - return sock; -} - - -/* ---------------------------- net_getsockopt ---------------------------- */ -NSAPI_PUBLIC int net_getsockopt(SYS_NETFD s, int level, int optname, - void *optval, int *optlen) -{ - return getsockopt(PR_FileDesc2NativeHandle(s), level, optname, - (char *)optval, (TCPLEN_T *)optlen); -} - - -/* ---------------------------- net_setsockopt ---------------------------- */ - - -NSAPI_PUBLIC int net_setsockopt(SYS_NETFD s, int level, int optname, - const void *optval, int optlen) -{ - return setsockopt(PR_FileDesc2NativeHandle(s), level, optname, - (const char *)optval, optlen); -} -/* ------------------------------ net_listen ------------------------------ */ - - -NSAPI_PUBLIC int net_listen(SYS_NETFD s, int backlog) -{ - return PR_Listen(s, backlog)==PR_FAILURE?IO_ERROR:0; -} - - -/* ------------------------- net_create_listener -------------------------- */ - - -NSAPI_PUBLIC SYS_NETFD net_create_listener(char *ipstr, int port) -{ - SYS_NETFD sd; - /* - struct sockaddr_in sa_server; - */ - PRNetAddr sa_server; - PRStatus status; - PRInt32 flags; - - if ((sd = net_socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) == SYS_NET_ERRORFD) { - return SYS_NET_ERRORFD; - } - -#ifdef SOLARIS - /* - * unset NONBLOCK flag; - */ - /* Have no idea why Solaris want to unset NONBLOCK flag when it should - be in NON-BLOCK mode, and new NSPR20 does not give file descriptor - back, so the code are removed --- yjh - flags = fcntl(sd->osfd, F_GETFL, 0); - fcntl(sd->osfd, F_SETFL, flags & ~O_NONBLOCK); - */ -#endif - /* Convert to NSPR21 for ns security integration - ZERO((char *) &sa_server, sizeof(sa_server)); - sa_server.sin_family=AF_INET; - sa_server.sin_addr.s_addr = (ipstr ? inet_addr(ipstr) : htonl(INADDR_ANY)); - sa_server.sin_port=htons(port); - if(net_bind(sd, (struct sockaddr *) &sa_server,sizeof(sa_server)) < 0) { - return SYS_NET_ERRORFD; - } - net_listen(sd, net_listenqsize); - */ - - if (ipstr) { - status = PR_InitializeNetAddr(PR_IpAddrNull, port, &sa_server); - if (status == PR_SUCCESS) sa_server.inet.ip = inet_addr(ipstr); - else return SYS_NET_ERRORFD; - } - else { - status = PR_InitializeNetAddr(PR_IpAddrAny, port, &sa_server); - if (status == PR_FAILURE) return SYS_NET_ERRORFD; - } - - status = PR_Bind(sd, &sa_server); - if (status == PR_FAILURE) return SYS_NET_ERRORFD; - - - status = PR_Listen(sd, net_listenqsize); - if (status == PR_FAILURE) return SYS_NET_ERRORFD; - - return sd; -} -/* ------------------------------ net_select ------------------------------ */ - -/* -NSAPI_PUBLIC int net_select(int nfds, fd_set *r, fd_set *w, fd_set *e, - struct timeval *timeout) -{ - PR_fd_set rd, wr, ex; - int index; - int rv; - - if (nfds > (64*1024)) - return -1; - - PR_FD_ZERO(&rd); - PR_FD_ZERO(&wr); - PR_FD_ZERO(&ex); - - for (index=0; index<nfds; index++) { - if (FD_ISSET(index, r)) - PR_FD_NSET(index, &rd); - if (FD_ISSET(index, w)) - PR_FD_NSET(index, &wr); - if (FD_ISSET(index, e)) - PR_FD_NSET(index, &ex); - } - - rv = PR_Select(0, &rd, &wr, &ex, PR_SecondsToInterval(timeout->tv_sec)); - if (rv > 0) { - FD_ZERO(r); - FD_ZERO(w); - FD_ZERO(e); - for (index=0; index<nfds; index++) { - if (PR_FD_NISSET(index, &rd)) - FD_SET(index, r); - if (PR_FD_NISSET(index, &wr)) - FD_SET(index, w); - if (PR_FD_NISSET(index, &ex)) - FD_SET(index, e); - } - } - - return rv; -} -*/ - -NSAPI_PUBLIC int net_select(int nfds, fd_set *r, fd_set *w, fd_set *e, - struct timeval *timeout) -{ - return 1; -} - - -/* ----------------------------- net_isalive ------------------------------ */ - - -/* - * XXXmikep As suggested by shaver@ingenia.com. If everyone was POSIX - * compilent, a write() of 0 bytes would work as well - */ -NSAPI_PUBLIC int net_isalive(SYS_NETFD sd) -{ - char c; - if (PR_RecvFrom(sd, &c, 1, MSG_PEEK, NULL, 0) == -1 ) { - return 0; - } - return 1; -} - - -/* ------------------------------ net_connect ------------------------------ */ - -NSAPI_PUBLIC int net_connect(SYS_NETFD s, const void *sockaddr, int namelen) -{ - int rv; - - child_status(CHILD_WRITING); - rv = PR_Connect(s, (PRNetAddr *)sockaddr, PR_INTERVAL_NO_TIMEOUT); - child_status(CHILD_PROCESSING); - - return rv==PR_FAILURE?IO_ERROR:0; -} - - -/* ------------------------------ net_ioctl ------------------------------ */ - - -NSAPI_PUBLIC int net_ioctl(SYS_NETFD s, int tag, void *result) -{ -#if defined(NET_WINSOCK) - return ioctlsocket(PR_FileDesc2NativeHandle(s),tag,(unsigned long *)result); -#elif defined(XP_UNIX) - return ioctl(PR_FileDesc2NativeHandle(s), tag, result); -#else - write me; -#endif - -} -/* --------------------------- net_getpeername ---------------------------- */ - - -NSAPI_PUBLIC int net_getpeername(SYS_NETFD s, struct sockaddr *name, - int *namelen) -{ -#if defined (SNI) || defined (UnixWare) - return getpeername(PR_FileDesc2NativeHandle(s), name, (size_t *)namelen); -#else /* defined (SNI) || defined (UnixWare) */ - return getpeername(PR_FileDesc2NativeHandle(s), name, (TCPLEN_T *)namelen); -#endif /* defined (SNI) || defined (UnixWare) */ -} - - -/* ------------------------------ net_close ------------------------------- */ - - -NSAPI_PUBLIC int net_close(SYS_NETFD s) -{ - return PR_Close(s)==PR_FAILURE?IO_ERROR:0; -} - -NSAPI_PUBLIC int net_shutdown(SYS_NETFD s, int how) -{ - switch (how) { - case 0: - return PR_Shutdown(s, PR_SHUTDOWN_RCV); - break; - case 1: - return PR_Shutdown(s, PR_SHUTDOWN_SEND); - break; - case 2: - return PR_Shutdown(s, PR_SHUTDOWN_BOTH); - break; - default: - return -1; - } - - return 0; -} - - - -/* ------------------------------- net_bind ------------------------------- */ - -NSAPI_PUBLIC int net_bind(SYS_NETFD s, const struct sockaddr *name, - int namelen) -{ - return PR_Bind(s, (const PRNetAddr *)name)==PR_FAILURE?IO_ERROR:0; -} - - -/* ------------------------------ net_accept ------------------------------ */ - - -NSAPI_PUBLIC SYS_NETFD net_accept(SYS_NETFD sd, struct sockaddr *addr, - int *addrlen) -{ - SYS_NETFD sock = PR_Accept(sd, (PRNetAddr *)addr, PR_INTERVAL_NO_TIMEOUT); - - if (sock == NULL) - return SYS_NET_ERRORFD; - return sock; -} - -/* ------------------------------- net_read ------------------------------- */ - -NSAPI_PUBLIC int net_read(SYS_NETFD fd, char *buf, int sz, int timeout) -{ - int rv; - - if (timeout == NET_ZERO_TIMEOUT) - timeout = PR_INTERVAL_NO_WAIT; - else if (timeout == NET_INFINITE_TIMEOUT) - timeout = PR_INTERVAL_NO_TIMEOUT; - else - timeout = PR_SecondsToInterval(timeout); - - child_status(CHILD_READING); - rv = PR_Recv(fd, buf, sz, 0, timeout); - - child_status(CHILD_PROCESSING); - return rv; -} - - -/* ------------------------------ net_write ------------------------------- */ - -#ifndef NEEDS_WRITEV -int net_writev(SYS_NETFD fd, struct iovec *iov, int iov_size) -{ - int rv; - - child_status(CHILD_WRITING); - rv = PR_Writev(fd, (PRIOVec *)iov, iov_size, PR_INTERVAL_NO_TIMEOUT); - child_status(CHILD_PROCESSING); - return rv; -} - -#else /* NEEDS_WRITEV */ - -/* Since SSL and NT do not support writev(), we just emulate it. - * This does not lead to the optimal number of packets going out... - */ -int net_writev(SYS_NETFD fd, struct iovec *iov, int iov_size) -{ - int index; - - child_status(CHILD_WRITING); - - for (index=0; index<iov_size; index++) { - - /* net_write already does the buffer for nonblocked IO */ - if ( net_write(fd, iov[index].iov_base, iov[index].iov_len) ==IO_ERROR){ - child_status(CHILD_PROCESSING); - return IO_ERROR; - } - } - - child_status(CHILD_PROCESSING); - return IO_OKAY; -} -#endif /* NEEDS_WRITEV */ - - -NSAPI_PUBLIC int net_write(SYS_NETFD fd, char *buf, int sz) -{ - int rv; - - child_status(CHILD_WRITING); - rv = PR_Send(fd, buf, sz, 0, PR_INTERVAL_NO_TIMEOUT); - child_status(CHILD_PROCESSING); - if(rv < 0) { - return IO_ERROR; - } - return rv; -} - -NSAPI_PUBLIC int net_socketpair(SYS_NETFD *pair) -{ - return PR_NewTCPSocketPair(pair); -} - -#ifdef XP_UNIX -NSAPI_PUBLIC SYS_NETFD net_dup2(SYS_NETFD prfd, int osfd) -{ - SYS_NETFD newfd = NULL; - - if (prfd && PR_FileDesc2NativeHandle(prfd) != osfd) { - if (dup2(PR_FileDesc2NativeHandle(prfd), osfd) != -1) { - newfd = PR_ImportFile(osfd); - if (!newfd) - close(osfd); - } - } - - return newfd; -} - -NSAPI_PUBLIC int net_is_STDOUT(SYS_NETFD prfd) -{ - int fd = PR_FileDesc2NativeHandle(prfd); - if (fd == STDOUT_FILENO) return 1; - return 0; -} - -NSAPI_PUBLIC int net_is_STDIN(SYS_NETFD prfd) -{ - int fd = PR_FileDesc2NativeHandle(prfd); - if (fd == STDIN_FILENO) return 1; - return 0; -} - -#endif /* XP_UNIX */ - -/* -------------------------- Accept mutex crap --------------------------- */ - - -#ifndef NET_WINSOCK - - -#include "sem.h" -static SEMAPHORE mob_sem; -static int have_mob_sem; - - -void net_accept_enter(void) -{ - if(sem_grab(mob_sem) == -1) - ereport(LOG_CATASTROPHE, "sem_grab failed (%s)", system_errmsg()); - have_mob_sem = 1; -} - -int net_accept_tenter(void) -{ - int ret = sem_tgrab(mob_sem); - if(ret != -1) - have_mob_sem = 1; - return ret; -} - -void net_accept_exit(void) -{ - if(sem_release(mob_sem) == -1) - ereport(LOG_CATASTROPHE, "sem_release failed (%s)", system_errmsg()); - have_mob_sem = 0; -} - -#ifdef AIX -#undef accept -#define accept naccept -#endif - -void net_accept_texit(void) -{ - if(have_mob_sem && (sem_release(mob_sem) == -1)) - ereport(LOG_CATASTROPHE, "sem_release failed (%s)", system_errmsg()); - have_mob_sem = 0; -} - -int net_accept_init(int port) -{ - /* XXXMB how to translate this to nspr? */ - /* since SSL_AcceptHook is no longer in ns security (HCL_1_5), - so this is gone! (It does exist in HCL_101) - SSL_AcceptHook((SSLAcceptFunc)PR_Accept); - */ - have_mob_sem = 0; - mob_sem = sem_init("netsite", port); - return (mob_sem == SEM_ERROR ? -1 : 0); -} - -void net_accept_terminate(void) -{ - sem_terminate(mob_sem); -} - -#endif /* !NET_WINSOCK */ - - -/* ----------------------------- net_ip2host ------------------------------ */ - - -char *dns_ip2host(char *ip, int verify); - -NSAPI_PUBLIC char *net_ip2host(char *ip, int verify) -{ - if(!net_enabledns) - return NULL; - - return dns_ip2host(ip, verify); -} - - - /* ---------------------------- util_hostname ----------------------------- */ - #ifdef XP_UNIX #include <sys/param.h> #else /* WIN32 */ #define MAXHOSTNAMELEN 255 #endif /* XP_UNIX */ -/* Defined in dns.c */ +/* Defined in dns.cpp */ char *net_find_fqdn(PRHostEnt *p); NSAPI_PUBLIC char *util_hostname(void) @@ -575,4 +62,3 @@ NSAPI_PUBLIC char *util_hostname(void) return net_find_fqdn(&hent); } - diff --git a/lib/base/plist_pvt.h b/lib/base/plist_pvt.h index e4b861c5..3f18b4af 100644 --- a/lib/base/plist_pvt.h +++ b/lib/base/plist_pvt.h @@ -35,9 +35,6 @@ typedef struct PListStruct_s PListStruct_t; * the property value data. */ -#ifndef PBLOCK_H -#include "base/pblock.h" -#endif /* PBLOCK_H */ #include <stddef.h> struct PLValueStruct_s { diff --git a/lib/base/pool.cpp b/lib/base/pool.cpp index 56232e3f..e33acd44 100644 --- a/lib/base/pool.cpp +++ b/lib/base/pool.cpp @@ -27,9 +27,6 @@ #ifdef MALLOC_POOLS #include "base/pool.h" #include "base/ereport.h" -#include "base/session.h" -#include "frame/req.h" -#include "frame/http.h" #include "base/util.h" #include "base/crit.h" @@ -107,40 +104,11 @@ pool_internal_init() known_pools_lock = crit_init(); freelist_lock = crit_init(); } - } else - ereport(LOG_INFORM, XP_GetAdminStr(DBT_poolInitMemoryPoolsDisabled_)); - - return 0; -} - -NSAPI_PUBLIC int -pool_init(pblock *pb, Session *sn, Request *rq) -{ - char *str_free_size = pblock_findval("free-size", pb); - char *str_pool_disable = pblock_findval("disable", pb); - - if (str_free_size != NULL) { - if ( (freelist_max = atoi(str_free_size)) <= 0) { - ereport(LOG_WARN, XP_GetAdminStr(DBT_poolInitFreeSize0UsingD_), - MAX_FREELIST_SIZE); - freelist_max = MAX_FREELIST_SIZE; - } } - if (str_pool_disable && strcasecmp(str_pool_disable, "false") ) - pool_disable = 1; - else - pool_disable = 0; - - if (known_pools_lock == NULL) { - known_pools_lock = crit_init(); - freelist_lock = crit_init(); - } - - return REQ_PROCEED; + return 0; } - static block_t * _create_block(int size) { diff --git a/lib/base/system.cpp b/lib/base/system.cpp index e58538b4..d138b400 100644 --- a/lib/base/system.cpp +++ b/lib/base/system.cpp @@ -10,7 +10,7 @@ */ #include "netsite.h" -#include "base/nsassert.h" +#include "prlog.h" #include "base/ereport.h" #ifdef XP_WIN32 @@ -52,6 +52,7 @@ static int thread_malloc_key = -1; #define DEBUG_FREE_CHAR 'X' #endif /* DEBUG_MALLOC */ + /* On NT, the server version string is not statically encoded based * upon a product compile define but dynamically set by the server * exe at startup. @@ -113,14 +114,14 @@ NSAPI_PUBLIC void system_free(void *ptr) #if defined(MALLOC_POOLS) && defined(MCC_HTTPD) && defined(THREAD_ANY) pool_free(MALLOC_KEY, ptr); #else - NS_ASSERT(ptr); + PR_ASSERT(ptr); free(ptr); #endif } NSAPI_PUBLIC char *system_strdup(const char *ptr) { - NS_ASSERT(ptr); + PR_ASSERT(ptr); #if defined(MALLOC_POOLS) && defined(MCC_HTTPD) && defined(THREAD_ANY) return pool_strdup(MALLOC_KEY, ptr); #else @@ -202,7 +203,7 @@ NSAPI_PUBLIC void system_free_perm(void *ptr) char *baseptr, *cptr; int index; - NS_ASSERT(ptr); + PR_ASSERT(ptr); cptr = baseptr = ((char *)ptr) - DEBUG_MARGIN - 2*sizeof(int); @@ -239,7 +240,7 @@ NSAPI_PUBLIC void system_free_perm(void *ptr) NSAPI_PUBLIC char *system_strdup_perm(const char *ptr) { #ifndef DEBUG_MALLOC - NS_ASSERT(ptr); + PR_ASSERT(ptr); return strdup(ptr); #else int len = strlen(ptr); diff --git a/lib/base/systhr.cpp b/lib/base/systhr.cpp index ac29121a..169405d6 100644 --- a/lib/base/systhr.cpp +++ b/lib/base/systhr.cpp @@ -10,7 +10,6 @@ */ #include "systhr.h" -#include "ereport.h" #define USE_NSPR #ifdef USE_NSPR diff --git a/lib/base/util.cpp b/lib/base/util.cpp index 55d6ca56..d775e00f 100644 --- a/lib/base/util.cpp +++ b/lib/base/util.cpp @@ -20,625 +20,12 @@ #include "base/util.h" #include "base/dbtbase.h" -#include "base/ereport.h" #ifdef XP_UNIX #include <sys/types.h> #endif /* WIN32 */ -/* ----------------------------- util_getline ----------------------------- */ - -#define LF 10 -#define CR 13 - -NSAPI_PUBLIC int util_getline(filebuf_t *buf, int lineno, int maxlen, char *l) { - int i, x; - - x = 0; - while(1) { - i = filebuf_getc(buf); - switch(i) { - case IO_EOF: - l[x] = '\0'; - return 1; - case LF: - if(x && (l[x-1] == '\\')) { - --x; - continue; - } - l[x] = '\0'; - return 0; - case IO_ERROR: - util_sprintf(l, "I/O error reading file at line %d", lineno); - return -1; - case CR: - continue; - default: - l[x] = (char) i; - if(++x == maxlen) { - util_sprintf(l, "line %d is too long", lineno); - return -1; - } - break; - } - } -} - - -/* ---------------------------- util_can_exec ----------------------------- */ - -#ifdef XP_UNIX -NSAPI_PUBLIC int util_can_exec(struct stat *fi, uid_t uid, gid_t gid) -{ - if(!uid) - return 1; - if((fi->st_mode & S_IXOTH) || - ((gid == fi->st_gid) && (fi->st_mode & S_IXGRP)) || - ((uid == fi->st_uid) && (fi->st_mode & S_IXUSR))) - return 1; - return 0; -} -#endif /* XP_UNIX */ - - -/* --------------------------- util_env_create ---------------------------- */ - - -NSAPI_PUBLIC char **util_env_create(char **env, int n, int *pos) -{ - int x; - - if(!env) { - *pos = 0; - return (char **) MALLOC((n + 1)*sizeof(char *)); - } - else { - for(x = 0; (env[x]); x++); - env = (char **) REALLOC(env, (n + x + 1)*(sizeof(char *))); - *pos = x; - return env; - } -} - - -/* ---------------------------- util_env_free ----------------------------- */ - - -NSAPI_PUBLIC void util_env_free(char **env) -{ - register char **ep = env; - - for(ep = env; *ep; ep++) - FREE(*ep); - FREE(env); -} - -/* ----------------------------- util_env_str ----------------------------- */ - - -NSAPI_PUBLIC char *util_env_str(char *name, char *value) { - char *t,*tp; - - t = (char *) MALLOC(strlen(name)+strlen(value)+2); /* 2: '=' and '\0' */ - - for(tp=t; (*tp = *name); tp++,name++); - for(*tp++ = '='; (*tp = *value); tp++,value++); - return t; -} - - -/* --------------------------- util_env_replace --------------------------- */ - - -NSAPI_PUBLIC void util_env_replace(char **env, char *name, char *value) -{ - int x, y, z; - char *i; - - for(x = 0; env[x]; x++) { - i = strchr(env[x], '='); - *i = '\0'; - if(!strcmp(env[x], name)) { - y = strlen(env[x]); - z = strlen(value); - - env[x] = (char *) REALLOC(env[x], y + z + 2); - util_sprintf(&env[x][y], "=%s", value); - return; - } - *i = '='; - } -} - - -/* ---------------------------- util_env_find ----------------------------- */ - - -NSAPI_PUBLIC char *util_env_find(char **env, char *name) -{ - char *i; - int x, r; - - for(x = 0; env[x]; x++) { - i = strchr(env[x], '='); - *i = '\0'; - r = !strcmp(env[x], name); - *i = '='; - if(r) - return i + 1; - } - return NULL; -} - - -/* ---------------------------- util_env_copy ----------------------------- */ - - -NSAPI_PUBLIC char **util_env_copy(char **src, char **dst) -{ - char **src_ptr; - int src_cnt; - int index; - - if (!src) - return NULL; - - for (src_cnt = 0, src_ptr = src; *src_ptr; src_ptr++, src_cnt++); - - if (!src_cnt) - return NULL; - - dst = util_env_create(dst, src_cnt, &index); - - for (src_ptr = src, index=0; *src_ptr; index++, src_ptr++) - dst[index] = STRDUP(*src_ptr); - dst[index] = NULL; - - return dst; -} - -/* ---------------------------- util_hostname ----------------------------- */ - - -/* - * MOVED TO NET.C TO AVOID INTERDEPENDENCIES - */ - - -/* --------------------------- util_chdir2path ---------------------------- */ - - -NSAPI_PUBLIC int util_chdir2path(char *path) -{ - /* use FILE_PATHSEP to accomodate WIN32 */ - char *t = strrchr(path, FILE_PATHSEP); - int ret; - - if(!t) - return -1; - - *t = '\0'; -#ifdef XP_UNIX - ret = chdir(path); -#else /* WIN32 */ - ret = SetCurrentDirectory(path); -#endif /* XP_UNIX */ - - /* use FILE_PATHSEP instead of chdir to accomodate WIN32 */ - *t = FILE_PATHSEP; - - return ret; -} - - -/* --------------------------- util_is_mozilla ---------------------------- */ - - -NSAPI_PUBLIC int util_is_mozilla(char *ua, char *major, char *minor) -{ - if((!ua) || strncasecmp(ua, "Mozilla/", 8)) - return 0; - - /* Major version. I punted on supporting versions like 10.0 */ - if(ua[8] > major[0]) - return 1; - else if((ua[8] < major[0]) || (ua[9] != '.')) - return 0; - - /* Minor version. Support version numbers like 0.96 */ - if(ua[10] < minor[0]) - return 0; - else if((ua[10] > minor[0]) || (!minor[1])) - return 1; - - if((!isdigit(ua[11])) || (ua[11] < minor[1])) - return 0; - else - return 1; -} - - -/* ----------------------------- util_is_url ------------------------------ */ - - -#include <ctype.h> /* isalpha */ - -NSAPI_PUBLIC int util_is_url(char *url) -{ - char *t = url; - - while(*t) { - if(*t == ':') - return 1; - if(!isalpha(*t)) - return 0; - ++t; - } - return 0; -} - - -/* --------------------------- util_later_than ---------------------------- */ - - -int _mstr2num(char *str) { - if(!strcasecmp(str, "Jan")) return 0; - if(!strcasecmp(str, "Feb")) return 1; - if(!strcasecmp(str, "Mar")) return 2; - if(!strcasecmp(str, "Apr")) return 3; - if(!strcasecmp(str, "May")) return 4; - if(!strcasecmp(str, "Jun")) return 5; - if(!strcasecmp(str, "Jul")) return 6; - if(!strcasecmp(str, "Aug")) return 7; - if(!strcasecmp(str, "Sep")) return 8; - if(!strcasecmp(str, "Oct")) return 9; - if(!strcasecmp(str, "Nov")) return 10; - if(!strcasecmp(str, "Dec")) return 11; - return -1; -} - -int _time_compare(struct tm *lms, char *ims, int later_than_op) -{ - int y = 0, mnum = 0, d = 0, h = 0, m = 0, s = 0, x; - char t[128]; - - /* Supported formats start with weekday (which we don't care about) */ - /* The sizeof(t) is to avoid buffer overflow with t */ - if((!(ims = strchr(ims,' '))) || (strlen(ims) > (sizeof(t) - 2))) - return 0; - - while(*ims && isspace(*ims)) ++ims; - if((!(*ims)) || (strlen(ims) < 2)) - return 0; - - /* Standard HTTP (RFC 850) starts with dd-mon-yy */ - if(ims[2] == '-') { - sscanf(ims, "%s %d:%d:%d", t, &h, &m, &s); - if(strlen(t) < 6) - return 0; - t[2] = '\0'; - t[6] = '\0'; - d = atoi(t); - mnum = _mstr2num(&t[3]); - x = atoi(&t[7]); - /* Postpone wraparound until 2070 */ - y = x + (x < 70 ? 2000 : 1900); - } - /* The ctime format starts with a month name */ - else if(isalpha(*ims)) { - sscanf(ims,"%s %d %d:%d:%d %*s %d", t, &d, &h, &m, &s, &y); - mnum = _mstr2num(t); - } - /* RFC 822 */ - else { - sscanf(ims, "%d %s %d %d:%d:%d", &d, t, &y, &h, &m, &s); - mnum = _mstr2num(t); - } - - if (later_than_op) { - if( (x = (1900 + lms->tm_year) - y) ) - return x < 0; - - if(mnum == -1) - return 0; - - /* XXXMB - this will fail if you check if december 31 1996 is later - * than january 1 1997 - */ - if((x = lms->tm_mon - mnum) || (x = lms->tm_mday - d) || - (x = lms->tm_hour - h) || (x = lms->tm_min - m) || - (x = lms->tm_sec - s)) - return x < 0; - - return 1; - } - else { - return (mnum != -1 && - 1900 + lms->tm_year == y && - lms->tm_mon == mnum && - lms->tm_mday == d && - lms->tm_hour == h && - lms->tm_min == m && - lms->tm_sec == s); - } -} - - -/* Returns 0 if lms later than ims - * Returns 1 if equal - * Returns 1 if ims later than lms - */ -NSAPI_PUBLIC int util_later_than(struct tm *lms, char *ims) -{ - return _time_compare(lms, ims, 1); -} - - -NSAPI_PUBLIC int util_time_equal(struct tm *lms, char *ims) -{ - return _time_compare(lms, ims, 0); -} - -/* util_str_time_equal() - * - * Function to compare if two time strings are equal - * - * Acceptible date formats: - * Saturday, 17-Feb-96 19:41:34 GMT <RFC850> - * Sat, 17 Mar 1996 19:41:34 GMT <RFC1123> - * - * Argument t1 MUST be RFC1123 format. - * - * Note- it is not the intention of this routine to *always* match - * There are cases where we would return != when the strings might - * be equal (especially with case). The converse should not be true. - * - * Return 0 if equal, -1 if not equal. - */ -#define MINIMUM_LENGTH 18 -#define RFC1123_DAY 5 -#define RFC1123_MONTH 8 -#define RFC1123_YEAR 12 -#define RFC1123_HOUR 17 -#define RFC1123_MINUTE 20 -#define RFC1123_SECOND 23 -NSAPI_PUBLIC int util_str_time_equal(char *t1, char *t2) -{ - int index; - - /* skip over leading whitespace... */ - while(*t1 && isspace(*t1)) ++t1; - while(*t2 && isspace(*t2)) ++t2; - - /* Check weekday */ - if ( (t1[0] != t2[0]) || (t1[1] != t2[1]) ) - return -1; - - /* Skip to date */ - while(*t2 && !isspace(*t2)) ++t2; - t2++; - - /* skip if not strings not long enough */ - if ( (strlen(t1) < MINIMUM_LENGTH) || (strlen(t2) < MINIMUM_LENGTH) ) - return -1; - - if ( (t1[RFC1123_DAY] != t2[0]) || (t1[RFC1123_DAY+1] != t2[1]) ) - return -1; - - /* Skip to the month */ - t2 += 3; - - if ( (t1[RFC1123_MONTH] != t2[0]) || (t1[RFC1123_MONTH+1] != t2[1]) || - (t1[RFC1123_MONTH+2] != t2[2]) ) - return -1; - - /* Skip to year */ - t2 += 4; - - if ( (t1[RFC1123_YEAR] != t2[0]) ) { - /* Assume t2 is RFC 850 format */ - if ( (t1[RFC1123_YEAR+2] != t2[0]) || (t1[RFC1123_YEAR+3] != t2[1]) ) - return -1; - - /* skip to hour */ - t2 += 3; - } else { - /* Assume t2 is RFC 1123 format */ - if ( (t1[RFC1123_YEAR+1] != t2[1]) || (t1[RFC1123_YEAR+2] != t2[2]) || - (t1[RFC1123_YEAR+3] != t2[3]) ) - return -1; - - /* skip to hour */ - t2 += 5; - } - - /* check date */ - for (index=0; index<8; index++) { - if ( t1[RFC1123_HOUR+index] != t2[index] ) - return -1; - } - - /* Ignore timezone */ - - return 0; -} - - -/* --------------------------- util_uri_is_evil --------------------------- */ - - -NSAPI_PUBLIC int util_uri_is_evil(char *t) -{ - register int x; - - for(x = 0; t[x]; ++x) { - if(t[x] == '/') { - if(t[x+1] == '/') - return 1; - if(t[x+1] == '.') { - switch(t[x+2]) { - case '.': - if((!t[x+3]) || (t[x+3] == '/')) - return 1; - case '/': - case '\0': - return 1; - } - } - } -#ifdef XP_WIN32 - /* On NT, the directory "abc...." is the same as "abc" - * The only cheap way to catch this globally is to disallow - * names with the trailing "."s. Hopefully this is not over - * restrictive - */ - if ((t[x] == '.') && ( (t[x+1] == '/') || (t[x+1] == '\0') )) { - return 1; - } -#endif - } - return 0; -} - -/* ---------------------------- util_uri_parse ---------------------------- */ - -NSAPI_PUBLIC void util_uri_parse(char *uri) -{ - int spos = 0, tpos = 0; - int l = strlen(uri); - - while(uri[spos]) { - if(uri[spos] == '/') { - if((spos != l) && (uri[spos+1] == '.')) { - if(uri[spos+2] == '/') - spos += 2; - else - if((spos <= (l-3)) && - (uri[spos+2] == '.') && (uri[spos+3] == '/')) { - spos += 3; - while((tpos > 0) && (uri[--tpos] != '/')) - uri[tpos] = '\0'; - } else - uri[tpos++] = uri[spos++]; - } else { - if(uri[spos+1] != '/') - uri[tpos++] = uri[spos++]; - else - spos++; - } - } else - uri[tpos++] = uri[spos++]; - } - uri[tpos] = '\0'; -} - - -/* -------------------- util_uri_unescape_and_normalize -------------------- */ - -#ifdef XP_WIN32 -/* The server calls this function to unescape the URI and also normalize - * the uri. Normalizing the uri converts all "\" characters in the URI - * and pathinfo portion to "/". Does not touch "\" in query strings. - */ -void util_uri_unescape_and_normalize(char *s) -{ - char *t, *u; - - for(t = s, u = s; *t; ++t, ++u) { - if((*t == '%') && t[1] && t[2]) { - *u = ((t[1] >= 'A' ? ((t[1] & 0xdf) - 'A')+10 : (t[1] - '0'))*16) + - (t[2] >= 'A' ? ((t[2] & 0xdf) - 'A')+10 : (t[2] - '0')); - t += 2; - } - else - if(u != t) - *u = *t; - if (*u == '\\') /* normalize */ - *u = '/'; - } - *u = *t; -} -#endif /* XP_WIN32 */ - -/* -------------------------- util_uri_unescape --------------------------- */ - -NSAPI_PUBLIC void util_uri_unescape(char *s) -{ - char *t, *u; - - for(t = s, u = s; *t; ++t, ++u) { - if((*t == '%') && t[1] && t[2]) { - *u = ((t[1] >= 'A' ? ((t[1] & 0xdf) - 'A')+10 : (t[1] - '0'))*16) + - (t[2] >= 'A' ? ((t[2] & 0xdf) - 'A')+10 : (t[2] - '0')); - t += 2; - } - else - if(u != t) - *u = *t; - } - *u = *t; -} - - -/* --------------------------- util_uri_escape ---------------------------- */ - - -NSAPI_PUBLIC char *util_uri_escape(char *od, char *s) -{ - char *d; - - if(!od) - od = (char *) MALLOC((strlen(s)*3) + 1); - d = od; - - while(*s) { - if(strchr("% ?#:+&*\"<>\r\n", *s)) { - sprintf(d, "%%%2x", *s); - ++s; d += 3; - } - else - *d++ = *s++; - } - *d = '\0'; - return od; -} - - -/* --------------------------- util_url_escape ---------------------------- */ - - -NSAPI_PUBLIC char *util_url_escape(char *od, char *s) -{ - char *d; - - if(!od) - od = (char *) MALLOC((strlen(s)*3) + 1); - d = od; - - while(*s) { - if(strchr("% +*\"<>\r\n", *s)) { - sprintf(d, "%%%.2x", *s); - ++s; d += 3; - } - else - *d++ = *s++; - } - *d = '\0'; - return od; -} - - -/* ------------------------- util_mime_separator -------------------------- */ - - -NSAPI_PUBLIC int util_mime_separator(char *sep) -{ - srand(time(NULL)); - return util_sprintf(sep, "%c%c--%d%d%d", CR, LF, rand(), rand(), rand()); -} - - /* ------------------------------ util_itoa ------------------------------- */ @@ -714,23 +101,6 @@ NSAPI_PUBLIC int util_sprintf(char *s, const char *fmt, ...) return PR_vsnprintf(s, UTIL_PRF_MAXSIZE, fmt, args); } -/* ---------------------------- util_sh_escape ---------------------------- */ - - -NSAPI_PUBLIC char *util_sh_escape(char *s) -{ - char *ns = (char *) MALLOC(strlen(s) * 2 + 1); /* worst case */ - register char *t, *u; - - for(t = s, u = ns; *t; ++t, ++u) { - if(strchr("&;`'\"|*?~<>^()[]{}$\\ #!", *t)) - *u++ = '\\'; - *u = *t; - } - *u = '\0'; - return ns; -} - /* --------------------------- util_strcasecmp ---------------------------- */ @@ -777,67 +147,6 @@ int util_strncasecmp(CASECMPARG_T char *one, CASECMPARG_T char *two, int n) } #endif /* NEED_STRNCASECMP */ -#ifdef XP_WIN32 - - -/* util_delete_directory() - * This routine deletes all the files in a directory. If delete_directory is - * TRUE it will also delete the directory itself. - */ -VOID -util_delete_directory(char *FileName, BOOL delete_directory) -{ - HANDLE firstFile; - WIN32_FIND_DATA findData; - char *TmpFile, *NewFile; - - if (FileName == NULL) - return; - - TmpFile = (char *)MALLOC(strlen(FileName) + 5); - sprintf(TmpFile, "%s\\*.*", FileName); - firstFile = FindFirstFile(TmpFile, &findData); - FREE(TmpFile); - - if (firstFile == INVALID_HANDLE_VALUE) - return; - - if(strcmp(findData.cFileName, ".") && - strcmp(findData.cFileName, "..")) { - NewFile = (char *)MALLOC(strlen(FileName) + 1 + - strlen(findData.cFileName) + 1); - sprintf(NewFile, "%s\\%s",FileName, findData.cFileName); - DeleteFile(NewFile); - FREE(NewFile); - } - while (TRUE) { - if(!(FindNextFile(firstFile, &findData))) { - if (GetLastError() != ERROR_NO_MORE_FILES) { - ereport(LOG_WARN, XP_GetAdminStr(DBT_couldNotRemoveTemporaryDirectory_), FileName, GetLastError()); - } else { - FindClose(firstFile); - if (delete_directory) - if(!RemoveDirectory(FileName)) { - ereport(LOG_WARN, - XP_GetAdminStr(DBT_couldNotRemoveTemporaryDirectory_1), - FileName, GetLastError()); - } - return; - } - } else { - if(strcmp(findData.cFileName, ".") && - strcmp(findData.cFileName, "..")) { - NewFile = (char *)MALLOC(strlen(FileName) + 5 + - strlen(findData.cFileName) + 1); - sprintf(NewFile,"%s\\%s", FileName, findData.cFileName); - DeleteFile(NewFile); - FREE(NewFile); - } - } - } -} -#endif - /* ------------------------------ util_strftime --------------------------- */ /* * Copyright (c) 1989 The Regents of the University of California. @@ -1118,30 +427,6 @@ _util_strftime_conv(char *pt, int n, int digits, char pad) return; } - -#ifdef XP_UNIX -/* - * Local Thread Safe version of waitpid. This prevents the process - * from blocking in the system call. - */ -NSAPI_PUBLIC pid_t -util_waitpid(pid_t pid, int *statptr, int options) -{ - pid_t rv; - - for(rv = 0; !rv; PR_Sleep(500)) { - rv = waitpid(pid, statptr, options | WNOHANG); - if (rv == -1) { - if (errno == EINTR) - rv = 0; /* sleep and try again */ - else - ereport(LOG_WARN, "waitpid failed for pid %d:%s", pid, system_errmsg()); - } - } - return rv; -} -#endif - /* * Various reentrant routines by mikep. See util.h and systems.h */ @@ -1164,111 +449,6 @@ util_waitpid(pid_t pid, int *statptr, int options) #endif -NSAPI_PUBLIC char * -util_strtok(register char *s, - register const char *delim, - register char **lasts) -{ -#ifdef HAVE_STRTOK_R - return strtok_r(s, delim, lasts); -#else - /* - * THIS IS THE THREAD SAFE VERSION OF strtok captured from - * public NetBSD. Note that no locks are needed - */ - register char *spanp; - register int c, sc; - char *tok; - - if (s == NULL && (s = *lasts) == NULL) - return (NULL); - - /* - * Skip (span) leading delimiters (s += strspn(s, delim), - * sort of). - */ - -cont: - c = *s++; - for (spanp = (char *)delim; (sc = *spanp++) != 0;) { - if (c == sc) - goto cont; - } - - if (c == 0) { /* no non-delimiter characters */ - *lasts = NULL; - return (NULL); - } - tok = s - 1; - - /* - * Scan token (scan for delimiters: s += strcspn(s, delim), - * sort of). - * Note that delim must have one NUL; we stop if we see that, too. - */ - for (;;) { - c = *s++; - spanp = (char *)delim; - do { - if ((sc = *spanp++) == c) { - if (c == 0) - s = NULL; - else - s[-1] = 0; - *lasts = s; - return (tok); - } - } while (sc != 0); - } - /* NOTREACHED */ -#endif /* no strtok_r */ -} - -#ifndef XP_WIN32 -NSAPI_PUBLIC struct passwd * -util_getpwnam(const char *name, struct passwd *result, char *buffer, - int buflen) -{ -#ifdef HAVE_PW_R - -#ifdef AIX -#if OSVERSION >= 4320 - return ((int)getpwnam_r(name, result, buffer, buflen, 0) == 0 ? result : NULL); -#else - return ((int)getpwnam_r(name, result, buffer, buflen) == 0 ? result : NULL); -#endif -#else - return getpwnam_r(name, result, buffer, buflen); -#endif /* AIX */ - -#else - char *lastp; - struct passwd *r; - RE_LOCK(pw); - r = getpwnam(name); - if (!r) - return r; - - result->pw_gid = r->pw_gid; - result->pw_uid = r->pw_uid; - /* Hope this buffer is long enough */ - if (buffer) - util_snprintf(buffer, buflen, "%s:%s:%d:%d:%s:%s:%s", r->pw_name, r->pw_passwd, - r->pw_uid, r->pw_gid, r->pw_gecos, r->pw_dir, r->pw_shell); - RE_UNLOCK(pw); - - result->pw_name = util_strtok(buffer, ":", &lastp); - result->pw_passwd = util_strtok(NULL, ":", &lastp); - (void) util_strtok(NULL, ":", &lastp); - (void) util_strtok(NULL, ":", &lastp); - result->pw_gecos = util_strtok(NULL, ":", &lastp); - result->pw_dir = util_strtok(NULL, ":", &lastp); - result->pw_shell = util_strtok(NULL, ":", &lastp); - return result; -#endif -} -#endif - NSAPI_PUBLIC struct tm * util_localtime(const time_t *clock, struct tm *res) { @@ -1290,160 +470,3 @@ util_localtime(const time_t *clock, struct tm *res) return res; #endif } - - -NSAPI_PUBLIC char * -util_ctime(const time_t *clock, char *buf, int buflen) -{ -/* - * From cgi-src/restore.c refering to XP_WIN32: - * MLM - gross, but it works, better now FLC - */ -#if !defined(HAVE_TIME_R) || defined(XP_WIN32) - RE_LOCK(ctime); - strncpy(buf, ctime(clock), buflen); - buf[buflen - 1] = '\0'; - RE_UNLOCK(ctime); - return buf; -#elif HAVE_TIME_R == 2 - return ctime_r(clock, buf); -#else /* HAVE_TIME_R == 3 */ - return ctime_r(clock, buf, buflen); -#endif -} - -NSAPI_PUBLIC struct tm * -util_gmtime(const time_t *clock, struct tm *res) -{ -#ifdef HAVE_TIME_R - return gmtime_r(clock, res); -#else - struct tm *rv; - time_t zero = 0x7fffffff; - - RE_LOCK(gmtime); - rv = gmtime(clock); - RE_UNLOCK(gmtime); - if (!rv) - rv = gmtime(&zero); - if (rv) - *res = *rv; - else - return NULL; - - return res; -#endif -} - -NSAPI_PUBLIC char * -util_asctime(const struct tm *tm, char *buf, int buflen) -{ -#if HAVE_TIME_R == 2 - return asctime_r(tm, buf); -#elif HAVE_TIME_R == 3 - return asctime_r(tm, buf, buflen); -#else - RE_LOCK(asctime); - strncpy(buf, asctime(tm), buflen); - buf[buflen - 1] = '\0'; - RE_UNLOCK(asctime); - return buf; -#endif -} - -NSAPI_PUBLIC char * -util_strerror(int errnum, char *msg, int buflen) -{ -#ifdef HAVE_STRERROR_R - /* More IBM real-genius */ - return ((int)strerror_r(errnum, msg, buflen) > 0) ? msg : NULL; -#else - /* RE_LOCK(strerror); I don't think this is worth the trouble */ - (void)strncpy(msg, strerror(errnum), buflen); - msg[buflen - 1] = '\0'; - return msg; - /* RE_UNLOCK(strerror); */ -#endif -} - - - -/* ------------------------------- OLD CODE ------------------------------- */ - - -#if 0 - -NSAPI_PUBLIC int util_vsnprintf(char *s, int n, register char *fmt, - va_list args) -{ - register int pos = 0, max = (n > 2 ? n-2 : -1), boundson; - register char c, *t; - - if((max == -1) && (n != -1)) - goto punt; - - boundson = (n != -1); - while(*fmt) { - if(boundson && (pos > max)) - break; - c = *fmt++; - switch(c) { - case '%': - switch(*fmt++) { - case 'd': - if(boundson && ((pos + 10) > max)) - goto punt; - pos += util_itoa(va_arg(args, int), &s[pos]); - break; - case 's': - t = va_arg(args, char *); - while(*t) { - s[pos++] = *t++; - if(boundson && (pos > max)) - goto punt; - } - break; - case 'c': - s[pos++] = (char) va_arg(args, int); - break; - case '%': - s[pos++] = '%'; - break; - } - break; - case '\\': - if( (s[pos++] = *fmt) ) - ++fmt; - break; - default: - s[pos++] = c; - } - } - punt: - s[pos] = '\0'; - - va_end(args); - return pos; -} - -NSAPI_PUBLIC int util_snprintf(char *s, int n, char *fmt, ...) -{ - va_list args; - - va_start(args, fmt); - return util_vsnprintf(s, n, fmt, args); -} - -NSAPI_PUBLIC int util_vsprintf(char *s, register char *fmt, va_list args) -{ - return util_vsnprintf(s, -1, fmt, args); -} - -NSAPI_PUBLIC int util_sprintf(char *s, char *fmt, ...) -{ - va_list args; - - va_start(args, fmt); - return util_vsnprintf(s, -1, fmt, args); -} -#endif |