diff --git a/ChangeLog b/ChangeLog index 91e4f68274..b912141ba4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Thu Nov 15 03:37:17 2001 Usaku Nakamura + + * hash.c (ruby_setenv): remove USE_WIN32_RTL_ENV block since it's + obsoleted. + + * win32/win32.c, win32/win32.h: sort out #if 0 - #endif or others. + Wed Nov 14 01:12:07 2001 Usaku Nakamura * win32/win32.c (waitpid): fix wait count. diff --git a/hash.c b/hash.c index 3ca5f88927..03ab63fae3 100644 --- a/hash.c +++ b/hash.c @@ -986,44 +986,6 @@ ruby_setenv(name, value) const char *value; { #if defined(WIN32) && !defined(__CYGWIN32__) -#ifdef USE_WIN32_RTL_ENV - register char *envstr; - STRLEN namlen = strlen(name); - STRLEN vallen; - char *oldstr = environ[envix(name)]; - - /* 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 (!value) { - if (!oldstr) - return; - value = ""; - vallen = 0; - } - else - vallen = strlen(val); - envstr = ALLOC_N(char, namelen + vallen + 3); - sprintf(envstr,"%s=%s",name,value); - 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 @@ -1037,10 +999,11 @@ ruby_setenv(name, value) * not see changes made by extensions that call the Win32 * functions directly, either. * GSAR 97-06-07 + * + * REMARK: USE_WIN32_RTL_ENV is already obsoleted since we don't use + * RTL's environ global variable directly yet. */ SetEnvironmentVariable(name,value); -#endif - #elif defined __CYGWIN__ #undef setenv #undef unsetenv diff --git a/win32/win32.c b/win32/win32.c index 4b6f6665a8..919688233a 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -67,10 +67,6 @@ #define TO_SOCKET(x) _get_osfhandle(x) bool NtSyncProcess = TRUE; -#if 0 // declared in header file -extern char **environ; -#define environ _environ -#endif static struct ChildRecord *CreateChild(char *, SECURITY_ATTRIBUTES *, HANDLE, HANDLE, HANDLE); static bool NtHasRedirection (char *); @@ -246,7 +242,6 @@ flock(int fd, int oper) //#undef const //FILE *fdopen(int, const char *); - // // Initialization stuff // @@ -258,7 +253,7 @@ NtInitialize(int *argc, char ***argv) int ret; // - // subvert cmd.exe\'s feeble attempt at command line parsing + // subvert cmd.exe's feeble attempt at command line parsing // *argc = NtMakeCmdVector((char *)GetCommandLine(), argv, TRUE); @@ -272,7 +267,6 @@ NtInitialize(int *argc, char ***argv) StartSockets(); } - char *getlogin() { char buffer[200]; @@ -292,9 +286,6 @@ char *getlogin() return NTLoginName; } - - -#if 1 #define MAXCHILDNUM 256 /* max num of child processes */ struct ChildRecord { @@ -458,7 +449,7 @@ mypopen (char *cmd, char *mode) int fd; // - // Figure out what we\'re doing... + // Figure out what we're doing... // reading = (*mode == 'r') ? TRUE : FALSE; @@ -540,11 +531,7 @@ mypclose(FILE *fp) rb_syswait(child->pid); return NUM2INT(rb_last_status); } -#endif -#if 1 - - int do_spawn(cmd) char *cmd; @@ -646,8 +633,6 @@ CreateChild(char *cmd, SECURITY_ATTRIBUTES *psa, HANDLE hInput, HANDLE hOutput, return child; } -#endif - typedef struct _NtCmdLineElement { struct _NtCmdLineElement *next, *prev; char *str; @@ -682,85 +667,9 @@ NtFreeCmdLine(void) // This function expands wild card characters that were spotted // during the parse phase. The idea here is to call FindFirstFile and // FindNextFile with the wildcard pattern specified, and splice in the -// resulting list of new names. If the wildcard pattern doesn\'t match +// resulting list of new names. If the wildcard pattern doesn't match // any existing files, just leave it in the list. // - -#if 0 -void -NtCmdGlob (NtCmdLineElement *patt) -{ - WIN32_FIND_DATA fd; - HANDLE fh; - char buffer[512]; - NtCmdLineElement *tmphead, *tmptail, *tmpcurr; - - strncpy(buffer, patt->str, patt->len); - buffer[patt->len] = '\0'; - if ((fh = FindFirstFile (buffer, &fd)) == INVALID_HANDLE_VALUE) { - return; - } - tmphead = tmptail = NULL; - do { - tmpcurr = ALLOC(NtCmdLineElement); - if (tmpcurr == NULL) { - fprintf(stderr, "Out of Memory in globbing!\n"); - while (tmphead) { - tmpcurr = tmphead; - tmphead = tmphead->next; - free(tmpcurr->str); - free(tmpcurr); - } - return; - } - memset (tmpcurr, 0, sizeof(*tmpcurr)); - tmpcurr->len = strlen(fd.cFileName); - tmpcurr->str = ALLOC_N(char, tmpcurr->len+1); - if (tmpcurr->str == NULL) { - fprintf(stderr, "Out of Memory in globbing!\n"); - while (tmphead) { - tmpcurr = tmphead; - tmphead = tmphead->next; - free(tmpcurr->str); - free(tmpcurr); - } - return; - } - strcpy(tmpcurr->str, fd.cFileName); - tmpcurr->flags |= NTMALLOC; - if (tmptail) { - tmptail->next = tmpcurr; - tmpcurr->prev = tmptail; - tmptail = tmpcurr; - } - else { - tmptail = tmphead = tmpcurr; - } - } while(FindNextFile(fh, &fd)); - - // - // ok, now we\'ve got a list of files that matched the wildcard - // specification. Put it in place of the pattern structure. - // - - tmphead->prev = patt->prev; - tmptail->next = patt->next; - - if (tmphead->prev) - tmphead->prev->next = tmphead; - - if (tmptail->next) - tmptail->next->prev = tmptail; - - // - // Now get rid of the pattern structure - // - - if (patt->flags & NTMALLOC) - free(patt->str); - // free(patt); //TODO: memory leak occures here. we have to fix it. -} -#else typedef struct { NtCmdLineElement *head; NtCmdLineElement *tail; @@ -826,7 +735,6 @@ NtCmdGlob (NtCmdLineElement *patt) free(patt->str); // free(patt); //TODO: memory leak occures here. we have to fix it. } -#endif // // Check a command string to determine if it has I/O redirection @@ -839,7 +747,7 @@ NtHasRedirection (char *cmd) int inquote = 0; char quote = '\0'; char *ptr ; - + // // Scan the string, looking for redirection (< or >) or pipe // characters (|) that are not in a quoted string @@ -889,7 +797,7 @@ NtMakeCmdVector (char *cmdline, char ***vec, int InputCmd) NtCmdLineElement *curr; // - // just return if we don\'t have a command line + // just return if we don't have a command line // if (cmdlen == 0) { @@ -911,8 +819,8 @@ NtMakeCmdVector (char *cmdline, char ***vec, int InputCmd) // // Ok, parse the command line, building a list of CmdLineElements. - // When we\'ve finished, and it\'s an input command (meaning that it\'s - // the processes argv), we\'ll do globing and then build the argument + // When we've finished, and it's an input command (meaning that it's + // the processes argv), we'll do globing and then build the argument // vector. // The outer loop does one interation for each element seen. // The inner loop does one interation for each character in the element. @@ -947,14 +855,14 @@ NtMakeCmdVector (char *cmdline, char ***vec, int InputCmd) case '/': // have to do this for NT/DOS option strings // - // check to see if we\'re parsing an option switch + // check to see if we're parsing an option switch // if (*ptr == '/' && base == ptr) continue; #endif // - // if we\'re not in a string, then we\'re finished with this + // if we're not in a string, then we're finished with this // element // @@ -967,7 +875,7 @@ NtMakeCmdVector (char *cmdline, char ***vec, int InputCmd) // // record the fact that this element has a wildcard character - // N.B. Don\'t glob if inside a single quoted string + // N.B. Don't glob if inside a single quoted string // if (!(instring && quote == '\'')) @@ -979,7 +887,7 @@ NtMakeCmdVector (char *cmdline, char ***vec, int InputCmd) // // If this string contains a newline, mark it as such so // we can replace it with the two character sequence "\n" - // (cmd.exe doesn\'t like raw newlines in strings...sigh). + // (cmd.exe doesn't like raw newlines in strings...sigh). // newline++; @@ -989,10 +897,10 @@ NtMakeCmdVector (char *cmdline, char ***vec, int InputCmd) case '\"': // - // if we\'re already in a string, see if this is the - // terminating close-quote. If it is, we\'re finished with + // if we're already in a string, see if this is the + // terminating close-quote. If it is, we're finished with // the string, but not neccessarily with the element. - // If we\'re not already in a string, start one. + // If we're not already in a string, start one. // if (instring) { @@ -1019,7 +927,7 @@ NtMakeCmdVector (char *cmdline, char ***vec, int InputCmd) ptr--; // - // when we get here, we\'ve got a pair of pointers to the element, + // when we get here, we've got a pair of pointers to the element, // base and ptr. Base points to the start of the element while ptr // points to the character following the element. // @@ -1030,7 +938,7 @@ NtMakeCmdVector (char *cmdline, char ***vec, int InputCmd) len = ptr - base; // - // if it\'s an input vector element and it\'s enclosed by quotes, + // if it's an input vector element and it's enclosed by quotes, // we can remove them. // @@ -1071,7 +979,7 @@ NtMakeCmdVector (char *cmdline, char ***vec, int InputCmd) if (InputCmd) { // - // When we get here we\'ve finished parsing the command line. Now + // When we get here we've finished parsing the command line. Now // we need to run the list, expanding any globbing patterns. // @@ -1100,7 +1008,7 @@ NtMakeCmdVector (char *cmdline, char ***vec, int InputCmd) // // make vptr point to the start of the buffer - // and ptr point to the area we\'ll consider the string table. + // and ptr point to the area we'll consider the string table. // // buffer (*vec) // | @@ -1126,7 +1034,6 @@ NtMakeCmdVector (char *cmdline, char ***vec, int InputCmd) return elements; } - // // UNIX compatible directory access functions for NT // @@ -1152,7 +1059,7 @@ opendir(const char *filename) HANDLE fh; // - // check to see if we\'ve got a directory + // check to see if we've got a directory // if ((win32_stat (filename, &sbuf) < 0 || @@ -1303,7 +1210,7 @@ rewinddir(DIR *dirp) } // -// This just free\'s the memory allocated by opendir +// This just free's the memory allocated by opendir // void @@ -1312,133 +1219,6 @@ closedir(DIR *dirp) free(dirp->start); free(dirp); } - - -// -// 98.2% of this code was lifted from the OS2 port. (JCW) -// - -#if 0 -// add_suffix is in util.c too. -/* - * Suffix appending for in-place editing under MS-DOS and OS/2 (and now NT!). - * - * Here are the rules: - * - * Style 0: Append the suffix exactly as standard perl would do it. - * If the filesystem groks it, use it. (HPFS will always - * grok it. So will NTFS. FAT will rarely accept it.) - * - * Style 1: The suffix begins with a '.'. The extension is replaced. - * If the name matches the original name, use the fallback method. - * - * Style 2: The suffix is a single character, not a '.'. Try to add the - * suffix to the following places, using the first one that works. - * [1] Append to extension. - * [2] Append to filename, - * [3] Replace end of extension, - * [4] Replace end of filename. - * If the name matches the original name, use the fallback method. - * - * Style 3: Any other case: Ignore the suffix completely and use the - * fallback method. - * - * Fallback method: Change the extension to ".$$$". If that matches the - * original name, then change the extension to ".~~~". - * - * If filename is more than 1000 characters long, we die a horrible - * death. Sorry. - * - * The filename restriction is a cheat so that we can use buf[] to store - * assorted temporary goo. - * - * Examples, assuming style 0 failed. - * - * suffix = ".bak" (style 1) - * foo.bar => foo.bak - * foo.bak => foo.$$$ (fallback) - * foo.$$$ => foo.~~~ (fallback) - * makefile => makefile.bak - * - * suffix = "~" (style 2) - * foo.c => foo.c~ - * foo.c~ => foo.c~~ - * foo.c~~ => foo~.c~~ - * foo~.c~~ => foo~~.c~~ - * foo~~~~~.c~~ => foo~~~~~.$$$ (fallback) - * - * foo.pas => foo~.pas - * makefile => makefile.~ - * longname.fil => longname.fi~ - * longname.fi~ => longnam~.fi~ - * longnam~.fi~ => longnam~.$$$ - * - */ - - -static char suffix1[] = ".$$$"; -static char suffix2[] = ".~~~"; - -#define ext (&buf[1000]) - -#define strEQ(s1,s2) (strcmp(s1,s2) == 0) - -void -add_suffix(struct RString *str, char *suffix) -{ - int baselen; - int extlen = strlen(suffix); - char *s, *t, *p; - int slen; - char buf[1024]; - - if (str->len > 1000) - rb_fatal("Cannot do inplace edit on long filename (%d characters)", str->len); - - /* Style 0 */ - slen = str->len; - str_cat(str, suffix, extlen); - if (valid_filename(str->ptr)) return; - - /* Fooey, style 0 failed. Fix str before continuing. */ - str->ptr[str->len = slen] = '\0'; - - slen = extlen; - t = buf; baselen = 0; s = str->ptr; - while ( (*t = *s) && *s != '.') { - baselen++; - if (*s == '\\' || *s == '/') baselen = 0; - s++; t++; - } - p = t; - - t = ext; extlen = 0; - while (*t++ = *s++) extlen++; - if (extlen == 0) { ext[0] = '.'; ext[1] = 0; extlen++; } - - if (*suffix == '.') { /* Style 1 */ - if (strEQ(ext, suffix)) goto fallback; - strcpy(p, suffix); - } else if (suffix[1] == '\0') { /* Style 2 */ - if (extlen < 4) { - ext[extlen] = *suffix; - ext[++extlen] = '\0'; - } else if (baselen < 8) { - *p++ = *suffix; - } else if (ext[3] != *suffix) { - ext[3] = *suffix; - } else if (buf[7] != *suffix) { - buf[7] = *suffix; - } else goto fallback; - strcpy(p, ext); - } else { /* Style 3: Panic */ -fallback: - (void)memcpy(p, strEQ(ext, suffix1) ? suffix2 : suffix1, 5); - } - str_grow(str, strlen(buf)); - memcpy(str->ptr, buf, str->len); -} -#endif static int valid_filename(char *s) @@ -1446,7 +1226,7 @@ valid_filename(char *s) int fd; // - // if the file exists, then it\'s a valid filename! + // if the file exists, then it's a valid filename! // if (_access(s, 0) == 0) { @@ -1454,26 +1234,25 @@ valid_filename(char *s) } // - // It doesn\'t exist, so see if we can open it. + // It doesn't exist, so see if we can open it. // if ((fd = _open(s, _O_CREAT, 0666)) >= 0) { close(fd); - _unlink (s); // don\'t leave it laying around + _unlink (s); // don't leave it laying around return 1; } return 0; } - // // This is a clone of fdopen so that we can handle the // brain damaged version of sockets that NT gets to use. // // The problem is that sockets are not real file handles and -// cannot be fdopen\'ed. This causes problems in the do_socket +// cannot be fdopen'ed. This causes problems in the do_socket // routine in doio.c, since it tries to create two file pointers -// for the socket just created. We\'ll fake out an fdopen and see +// for the socket just created. We'll fake out an fdopen and see // if we can prevent perl from trying to do stdio on sockets. // @@ -1616,7 +1395,6 @@ myfdclose(FILE *fp) }); } - // // Since the errors returned by the socket error function // WSAGetLastError() are not known by the library routine strerror @@ -1651,7 +1429,7 @@ mystrerror(int e) } return strerror(e); } - + // // various stubs // @@ -1660,7 +1438,7 @@ mystrerror(int e) // Ownership // // Just pretend that everyone is a superuser. NT will let us know if -// we don\'t really have permission to do something. +// we don't really have permission to do something. // #define ROOT_UID 0 @@ -1713,7 +1491,6 @@ ioctl(int i, unsigned int u, long data) return -1; } - #undef FD_SET void @@ -1766,7 +1543,7 @@ myfdisset(int fd, fd_set *set) // // Networking trampolines // These are used to avoid socket startup/shutdown overhead in case -// the socket routines aren\'t used. +// the socket routines aren't used. // #undef select @@ -1870,7 +1647,7 @@ StartSockets () int iSockOpt; // - // initalize the winsock interface and insure that it\'s + // initalize the winsock interface and insure that it's // cleaned up at exit. // version = MAKEWORD(1, 1); @@ -2263,7 +2040,6 @@ void setnetent (int stayopen) {} void setprotoent (int stayopen) {} void setservent (int stayopen) {} - #ifndef WNOHANG #define WNOHANG -1 @@ -2646,7 +2422,6 @@ mytimes(struct tms *tmbuf) return 0; } - #undef Sleep #define yield_once() Sleep(0) #define yield_until(condition) do yield_once(); while (!(condition)) @@ -2961,6 +2736,15 @@ char **win32_get_environ(void) char **myenvtop, **myenv; int num; + /* + * We avoid values started with `='. If you want to deal those values, + * change this function, and some functions in hash.c which recognize + * `=' as delimiter or win32_getenv() and ruby_setenv(). + * CygWin deals these values by changing first `=' to '!'. But we don't + * use such trick and follow cmd.exe's way that just doesn't show these + * values. + * (U.N. 2001-11-15) + */ envtop = GetEnvironmentStrings(); for (env = envtop, num = 0; *env; env += strlen(env) + 1) if (*env != '=') num++; diff --git a/win32/win32.h b/win32/win32.h index 0cf67f56a5..6dda8658ee 100644 --- a/win32/win32.h +++ b/win32/win32.h @@ -20,51 +20,6 @@ // Definitions for NT port of Perl // -// -// GRRRR!!!! Windows Nonsense. -// Define the following so we don't get tons of extra stuff -// when we include windows.h -// -#if 0 -#define NOGDICAPMASKS -#define NOVIRTUALKEYCODES -#define NOWINMESSAGES -#define NOWINSTYLES -#define NOSYSMETRICS -#define NOMENUS -#define NOICONS -#define NOKEYSTATES -#define NOSYSCOMMANDS -#define NORASTEROPS -#define NOSHOWWINDOW -#define OEMRESOURCE -#define NOATOM -#define NOCLIPBOARD -#define NOCOLOR -#define NOCTLMGR -#define NODRAWTEXT -#define NOGDI -//#define NOKERNEL -//#define NOUSER -#define NONLS -#define NOMB -#define NOMEMMGR -#define NOMETAFILE -#define NOMINMAX -#define NOMSG -#define NOOPENFILE -#define NOSCROLL -#define NOSERVICE -#define NOSOUND -#define NOTEXTMETRIC -#define NOWH -#define NOWINOFFSETS -#define NOCOMM -#define NOKANJI -#define NOHELP -#define NOPROFILER -#define NODEFERWINDOWPOS -#endif // // Ok now we can include the normal include files. @@ -79,7 +34,7 @@ #undef OpenFile #endif // -// We\'re not using Microsoft\'s "extensions" to C for +// We're not using Microsoft's "extensions" to C for // Structured Exception Handling (SEH) so we can nuke these // #undef try @@ -264,11 +219,6 @@ extern GIDTYPE getegid (void); extern int setuid (int); extern int setgid (int); - -#if 0 -extern int sys_nerr; -extern char *sys_errlist[]; -#endif extern char *mystrerror(int); #define strerror(e) mystrerror(e)