From fd1d8cdc09ed86e4a0812120a17ff0d7b04adcaf Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 16 Jan 1998 12:19:22 +0000 Subject: *** empty log message *** git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/RUBY@11 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- missing/dir.h | 63 ------------------------- missing/nt.c | 15 +++--- missing/nt.h | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ missing/setenv.c | 74 +++++++++++++++++++++++++++++- 4 files changed, 219 insertions(+), 70 deletions(-) (limited to 'missing') diff --git a/missing/dir.h b/missing/dir.h index 5c6281fdc2..34be77b9c0 100644 --- a/missing/dir.h +++ b/missing/dir.h @@ -183,66 +183,3 @@ void rewinddir(DIR *dirp); void closedir(DIR *dirp); #endif /* __DIR_INCLUDED */ -/* $RCSfile: dir.h,v $$Revision: 4.0.1.1 $$Date: 91/06/07 11:22:10 $ - * - * (C) Copyright 1987, 1990 Diomidis Spinellis. - * - * You may distribute under the terms of either the GNU General Public - * License or the Artistic License, as specified in the README file. - * - * $Log: dir.h,v $ - * Revision 4.0.1.1 91/06/07 11:22:10 lwall - * patch4: new copyright notice - * - * Revision 4.0 91/03/20 01:34:20 lwall - * 4.0 baseline. - * - * Revision 3.0.1.1 90/03/27 16:07:08 lwall - * patch16: MSDOS support - * - * Revision 1.1 90/03/18 20:32:29 dds - * Initial revision - * - * - */ - -/* - * defines the type returned by the directory(3) functions - */ - -#ifndef __DIR_INCLUDED -#define __DIR_INCLUDED - -/*Directory entry size */ -#ifdef DIRSIZ -#undef DIRSIZ -#endif -#define DIRSIZ(rp) (sizeof(struct direct)) - -/* - * Structure of a directory entry - */ -struct direct { - ino_t d_ino; /* inode number (not used by MS-DOS) */ - int d_namlen; /* Name length */ - char d_name[256]; /* file name */ -}; - -struct _dir_struc { /* Structure used by dir operations */ - char *start; /* Starting position */ - char *curr; /* Current position */ - long size; /* Size of string table */ - long nfiles; /* number if filenames in table */ - struct direct dirstr; /* Directory structure to return */ -}; - -typedef struct _dir_struc DIR; /* Type returned by dir operations */ - -DIR *cdecl opendir(char *filename); -struct direct *readdir(DIR *dirp); -long telldir(DIR *dirp); -void seekdir(DIR *dirp,long loc); -void rewinddir(DIR *dirp); -void closedir(DIR *dirp); - -#endif /* __DIR_INCLUDED */ diff --git a/missing/nt.c b/missing/nt.c index 1cd81fd28c..703556cad7 100644 --- a/missing/nt.c +++ b/missing/nt.c @@ -149,8 +149,8 @@ flock(int fd, int oper) #undef LK_LEN -#undef const -FILE *fdopen(int, const char *); +//#undef const +//FILE *fdopen(int, const char *); #if 0 void @@ -185,7 +185,7 @@ NtInitialize(int *argc, char ***argv) { tzset(); // Initialize Winsock - // StartSockets(); + StartSockets(); } @@ -501,7 +501,6 @@ mypopen (char *cmd, char *mode) return fp; } - fRet = CreatePipe(&hInFile, &hOutFile, &sa, 2048L); if (!fRet) Fatal("cannot open pipe \"%s\" (%s)", cmd, strerror(errno)); @@ -1572,7 +1571,7 @@ valid_filename(char *s) // FILE * -fdopen (int fd, const char *mode) +myfdopen (int fd, const char *mode) { FILE *fp; char sockbuf[80]; @@ -1580,6 +1579,8 @@ fdopen (int fd, const char *mode) int retval; extern int errno; + //fprintf(stderr, "myfdopen()\n"); + retval = getsockopt((SOCKET)fd, SOL_SOCKET, SO_TYPE, sockbuf, &optlen); if (retval == SOCKET_ERROR) { int iRet; @@ -1951,8 +1952,10 @@ mysocket (int af, int type, int protocol) if (!NtSocketsInitialized++) { StartSockets(); } - if ((s = socket (af, type, protocol)) == INVALID_SOCKET) + if ((s = socket (af, type, protocol)) == INVALID_SOCKET) { errno = WSAGetLastError(); + //fprintf(stderr, "socket fail (%d)", WSAGetLastError()); + } return s; } diff --git a/missing/nt.h b/missing/nt.h index 5977a59a1d..830b9edf13 100644 --- a/missing/nt.h +++ b/missing/nt.h @@ -147,6 +147,29 @@ extern char *NtGetLib(void); extern char *NtGetBin(void); extern FILE *mypopen(char *, char *); extern int flock(int fd, int oper); +extern FILE * myfdopen(int, char*); +extern SOCKET myaccept(SOCKET, struct sockaddr *, int *); +extern int mybind(SOCKET, struct sockaddr *, int); +extern int myconnect(SOCKET, struct sockaddr *, int); +extern int mygetpeername(SOCKET, struct sockaddr *, int *); +extern int mygetsockname(SOCKET, struct sockaddr *, int *); +extern int mygetsockopt(SOCKET, int, int, char *, int *); +extern int myioctlsocket(SOCKET, long, u_long *); +extern int mylisten(SOCKET, int); +extern int myrecv(SOCKET, char *, int, int); +extern int myrecvfrom(SOCKET, char *, int, int, struct sockaddr *, int *); +extern int mysend(SOCKET, char *, int, int); +extern int mysendto(SOCKET, char *, int, int, struct sockaddr *, int); +extern int mysetsockopt(SOCKET, int, int, char *, int); +extern int myshutdown(SOCKET, int); +extern SOCKET mysocket(int, int, int); +extern struct hostent * mygethostbyaddr(char *, int, int); +extern struct hostent * mygethostbyname(char *); +extern int mygethostname(char *, int); +extern struct protoent * mygetprotobyname(char *); +extern struct protoent * mygetprotobynumber(int); +extern struct servent * mygetservbyname(char *, char *); +extern struct servent * mygetservbyport(int, char *); // // define this so we can do inplace editing @@ -222,4 +245,118 @@ extern char *mystrerror(int); #undef va_start #undef va_end +#ifdef fdopen +#undef fdopen +#endif +#define fdopen myfdopen + +#ifdef accept +#undef accept +#endif +#define accept myaccept + +#ifdef bind +#undef bind +#endif +#define bind mybind + +#ifdef connect +#undef connect +#endif +#define connect myconnect + +#ifdef getpeername +#undef getpeername +#endif +#define getpeername mygetpeername + +#ifdef getsockname +#undef getsockname +#endif +#define getsockname mygetsockname + +#ifdef getsockopt +#undef getsockopt +#endif +#define getsockopt mygetsockopt + +#ifdef ioctlsocket +#undef ioctlsocket +#endif +#define ioctlsocket myioctlsocket + +#ifdef listen +#undef listen +#endif +#define listen mylisten + +#ifdef recv +#undef recv +#endif +#define recv myrecv + +#ifdef recvfrom +#undef recvfrom +#endif +#define recvfrom myrecvfrom + +#ifdef send +#undef send +#endif +#define send mysend + +#ifdef sendto +#undef sendto +#endif +#define sendto mysendto + +#ifdef setsockopt +#undef setsockopt +#endif +#define setsockopt mysetsockopt + +#ifdef shutdown +#undef shutdown +#endif +#define shutdown myshutdown + +#ifdef socket +#undef socket +#endif +#define socket mysocket + +#ifdef gethostbyaddr +#undef gethostbyaddr +#endif +#define gethostbyaddr mygethostbyaddr + +#ifdef gethostbyname +#undef gethostbyname +#endif +#define gethostbyname mygethostbyname + +#ifdef gethostname +#undef gethostname +#endif +#define gethostname mygethostname + +#ifdef getprotobyname +#undef getprotobyname +#endif +#define getprotobyname mygetprotobyname + +#ifdef getprotobynumber +#undef getprotobynumber +#endif +#define getprotobynumber mygetprotobynumber + +#ifdef getservbyname +#undef getservbyname +#endif +#define getservbyname mygetservbyname + +#ifdef getservbyport +#undef getservbyport +#endif +#define getservbyport mygetservbyport #endif diff --git a/missing/setenv.c b/missing/setenv.c index b7b43a674b..c9cb4b20e0 100644 --- a/missing/setenv.c +++ b/missing/setenv.c @@ -16,6 +16,10 @@ extern char **origenviron; char *strdup(); #endif +#ifdef USE_WIN32_RTL_ENV +#include +#endif + static int envix(nam) char *nam; @@ -29,9 +33,11 @@ char *nam; return i; } +#ifndef WIN32 void -setenv(nam,val) +setenv(nam,val, n) char *nam, *val; +int n; { register int i=envix(nam); /* where does it go? */ @@ -75,3 +81,69 @@ char *nam, *val; (void)sprintf(environ[i] + strlen(nam),"=%s",val); #endif /* MSDOS */ } +#else /* if WIN32 */ +void +setenv(nam,val, n) +char *nam, *val; +int n; +{ +#ifdef USE_WIN32_RTL_ENV + + register char *envstr; + STRLEN namlen = strlen(nam); + STRLEN vallen; + char *oldstr = environ[envix(nam)]; + + /* putenv() has totally broken semantics in both the Borland + * and Microsoft CRTLs. They either store the passed pointer in + * the environment without making a copy, or make a copy and don't + * free it. And on top of that, they dont free() old entries that + * are being replaced/deleted. This means the caller must + * free any old entries somehow, or we end up with a memory + * leak every time setenv() is called. One might think + * one could directly manipulate environ[], like the UNIX code + * above, but direct changes to environ are not allowed when + * calling putenv(), since the RTLs maintain an internal + * *copy* of environ[]. Bad, bad, *bad* stink. + * GSAR 97-06-07 + */ + + if (!val) { + if (!oldstr) + return; + val = ""; + vallen = 0; + } + else + vallen = strlen(val); + envstr = ALLOC_N(char, namelen + vallen + 3); + (void)sprintf(envstr,"%s=%s",nam,val); + (void)putenv(envstr); + if (oldstr) + free(oldstr); +#ifdef _MSC_VER + free(envstr); /* MSVCRT leaks without this */ +#endif + +#else /* !USE_WIN32_RTL_ENV */ + + /* The sane way to deal with the environment. + * Has these advantages over putenv() & co.: + * * enables us to store a truly empty value in the + * environment (like in UNIX). + * * we don't have to deal with RTL globals, bugs and leaks. + * * Much faster. + * Why you may want to enable USE_WIN32_RTL_ENV: + * * environ[] and RTL functions will not reflect changes, + * which might be an issue if extensions want to access + * the env. via RTL. This cuts both ways, since RTL will + * not see changes made by extensions that call the Win32 + * functions directly, either. + * GSAR 97-06-07 + */ + SetEnvironmentVariable(nam,val); + +#endif +} + +#endif /* WIN32 */ -- cgit v1.2.3