[Note that this seems to mostly be for NT Watcom...in part anyway. Patches are backwards. Not sure how to sort this out, in general. -kingdon] From: jalving@ibm.net Date: Wed, 18 Dec 96 23:05:43 +0100 To: bug-cvs@prep.ai.mit.edu Subject: CVS 1.9 for NT and OS/2 Hi, I've been busy with CVS for a while, trying to get it to work for NT and OS/2 in "local" mode. I have tried the executables that were provided and encountered some problems: - the OS/2 version needs a DLL that is probably the RTL for the IBM C Set/2 compiler. I don't use this compiler and consequently I cannot run this executable, - Both the NT version and the OS/2 version do not work properly for local access: in root.c it decodes a local name badly since a drive letter in a name is confused with server access. - To allow for multiple compilers one would have to have a config.h that uses compiler settings to define what is present and what's not. - For OS/2 (and I suspect for NT too) the method of passing logmessages to RCS is broken. When passing longer messages it may cause problems, because part of the logmessage will be seen as files or arguments. What is needed is a patch to allow an extra parameter to RCS, allowing it to read the message from a file. I have such a patch but I am unable to locate someone to send it to! The patch in CVS is trivial too, and for me it solved the problem. - The NT version didn't always release it's handles, and it has no native version of popen and pclose. I set out to solve these problems and found out that compiling cvs for these platforms is very dependent of the compiler. I was able to compile the stuff after a lot of patches though (with the Watcom C compiler). A big problem is the makefile for these platforms: the several make programs provided with the several compiler vendors all differ in many respects. And using GMAKE doesn't seem to be a solution since it does not provide support for response files (most PC compilers do not allow 100+ object files on a command line when linking). My question is as follows: I should be able to change the support for NT and OS/2 in such a way that it would be possible to compile CVS with several compilers. It would mean a lot of changes in the os2/ and windows-nt/ directories, and a different makefile. Is this useful? If not I'll spent my time on something else. I've included some of the patches I made which solve most of the above problems, perhaps you can look into them. I cannot currently test them for the Microsoft compiler though, and some of the things (mostly the changes in the NT part that have to do with the stupid MS notion of putting _ before all UNIX/POSIX calls) will not compile there. I will solve that when I've gotten access to the MS compiler suite. diff -c -w -B -b -i -r cvs/lib/system.h cvs-1.9/lib/system.h *** cvs/lib/system.h Wed Nov 06 22:52:09 1996 --- cvs-1.9/lib/system.h Mon Aug 12 08:05:46 1996 *************** *** 159,169 **** off_t lseek (); #endif ! #ifdef TIME_WITH_SYS_TIME # include # include #else ! # ifdef HAVE_SYS_TIME_H # include # else # include --- 159,169 ---- off_t lseek (); #endif ! #if TIME_WITH_SYS_TIME # include # include #else ! # if HAVE_SYS_TIME_H # include # else # include The next one is a nasty one: watcom defines va_list as char* va_list[1], which means that the thing already has pointer semantics. Using & on this results in trouble, and one cannot assign proper.. I've used the code below to circumvent the problem; it works for other PC compilers but I do not know if it works for Unix... diff -c -w -B -b -i -r cvs/lib/vasprintf.c cvs-1.9/lib/vasprintf.c *** cvs/lib/vasprintf.c Wed Dec 18 18:40:06 1996 --- cvs-1.9/lib/vasprintf.c Wed Sep 25 16:51:44 1996 *************** *** 43,66 **** extern char *malloc (); #endif - #ifdef __WATCOMC__ - static void vaCopy(va_list* to, va_list from) - { - memcpy(*to, from, sizeof(va_list)); - } - #else - static void vaCopy(va_list* to, va_list from) - { - *to = from; - } - #endif - - static int int_vasprintf (result, format, args) char **result; const char *format; ! va_list args; { const char *p = format; /* Add one to make sure that it is never zero, which might cause malloc --- 43,53 ---- extern char *malloc (); #endif static int int_vasprintf (result, format, args) char **result; const char *format; ! va_list *args; { const char *p = format; /* Add one to make sure that it is never zero, which might cause malloc *************** *** 68,74 **** int total_width = strlen (format) + 1; va_list ap; ! vaCopy(&ap, args); while (*p != '\0') { if (*p++ == '%') --- 55,62 ---- int total_width = strlen (format) + 1; va_list ap; ! memcpy (&ap, args, sizeof (va_list)); ! while (*p != '\0') { if (*p++ == '%') *************** *** 130,136 **** #endif *result = malloc (total_width); if (*result != NULL) ! return vsprintf (*result, format, args); else return 0; } --- 118,124 ---- #endif *result = malloc (total_width); if (*result != NULL) ! return vsprintf (*result, format, *args); else return 0; } *************** *** 141,147 **** const char *format; va_list args; { ! return int_vasprintf (result, format, args); } #ifdef TEST --- 129,135 ---- const char *format; va_list args; { ! return int_vasprintf (result, format, &args); } #ifdef TEST diff -c -w -B -b -i -r cvs/src/main.c cvs-1.9/src/main.c *** cvs/src/main.c Thu Nov 14 00:09:24 1996 --- cvs-1.9/src/main.c Tue Oct 01 23:04:02 1996 *************** *** 17,27 **** #ifdef HAVE_WINSOCK_H #include #else - - #if ! defined(__WATCOMC__) extern int gethostname (); #endif - #endif char *program_name; char *program_path; --- 17,24 ---- *************** *** 863,869 **** #endif if (err) ! return EXIT_FAILURE; return 0; } --- 860,866 ---- #endif if (err) ! return (EXIT_FAILURE); return 0; } *** src\root.c Wed Dec 18 22:40:42 1996 --- ..\cvs-1.9\src\root.c Thu Sep 05 12:16:06 1996 *************** *** 22,70 **** #ifndef DEBUG - static int - DecodeRoot(root) - char* root; - { - char method[20], *p; - - if(*root == 0) return -1; - if(*root != ':') /* Not a before the path? */ - { - if(isabsolute(root)) - return local_method; - return -1; /* Not absolute: bad root. */ - } - strncpy(method, root+1, 19); - method[19] = 0; - p = strchr(method, ':'); - if(p == 0) return -1; /* Missing terminator */ - *p = 0; - - if (strcmp (method, "local") == 0) - { - if(isabsolute(root + 7)) - return local_method; - return -1; - } - #ifdef CLIENT_SUPPORT - else if (strcmp (method, "pserver") == 0) - return pserver_method; - else if (strcmp (method, "kserver") == 0) - return kserver_method; - else if (strcmp (method, "server") == 0) - return server_method; - else if (strcmp (method, "ext") == 0) - return ext_method; - #endif - else - { - error (0, 0, "unknown method in root: %s", root); - return -1; - } - } - - char * Name_Root(dir, update_dir) char *dir; --- 22,27 ---- *************** *** 125,131 **** * root now contains a candidate for CVSroot. It must be an * absolute pathname */ ! if(DecodeRoot(root) == -1) { error (0, 0, "in directory %s:", xupdate_dir); error (0, 0, --- 82,95 ---- * root now contains a candidate for CVSroot. It must be an * absolute pathname */ ! ! #ifdef CLIENT_SUPPORT ! /* It must specify a server via remote CVS or be an absolute pathname. */ ! if ((strchr (root, ':') == NULL) ! && ! isabsolute (root)) ! #else /* ! CLIENT_SUPPORT */ ! if (root[0] != '/') ! #endif /* CLIENT_SUPPORT */ { error (0, 0, "in directory %s:", xupdate_dir); error (0, 0, *************** *** 294,300 **** SERVER_METHOD/EXT_METHOD if the string contains a colon or LOCAL_METHOD otherwise. */ ! CVSroot_method = ((strchr (cvsroot_copy, ':') && cvsroot_copy[1] != ':') #ifdef RSH_NOT_TRANSPARENT ? server_method #else --- 258,264 ---- SERVER_METHOD/EXT_METHOD if the string contains a colon or LOCAL_METHOD otherwise. */ ! CVSroot_method = ((strchr (cvsroot_copy, ':')) #ifdef RSH_NOT_TRANSPARENT ? server_method #else diff -c -w -B -b -i -r cvs/src/run.c cvs-1.9/src/run.c *** cvs/src/run.c Wed Nov 06 23:07:09 1996 --- cvs-1.9/src/run.c Wed Feb 28 23:30:54 1996 *************** *** 311,318 **** mask = sigblock (sigmask (SIGINT) | sigmask (SIGQUIT)); #else istat = signal (SIGINT, SIG_IGN); - - #if defined(SIGQUIT) qstat = signal (SIGQUIT, SIG_IGN); #endif #endif --- 311,316 ---- *************** *** 339,348 **** rc = WEXITSTATUS (status); else if (WIFSIGNALED (status)) { - #if defined(SIGPIPE) if (WTERMSIG (status) == SIGPIPE) error (1, 0, "broken pipe"); - #endif rc = 2; } else --- 337,344 ---- Only in cvs/src: t.dif diff -c -w -B -b -i -r cvs/src/zlib.c cvs-1.9/src/zlib.c *** cvs/src/zlib.c Wed Nov 06 23:08:06 1996 --- cvs-1.9/src/zlib.c Mon Aug 12 19:53:12 1996 *************** *** 26,32 **** #if defined (SERVER_SUPPORT) || defined (CLIENT_SUPPORT) ! #include /* OS/2 doesn't have EIO. FIXME: this whole notion of turning a different error into EIO strikes me as pretty dubious. */ --- 26,32 ---- #if defined (SERVER_SUPPORT) || defined (CLIENT_SUPPORT) ! #include "zlib.h" /* OS/2 doesn't have EIO. FIXME: this whole notion of turning a different error into EIO strikes me as pretty dubious. */ diff -c -w -B -b -i -r cvs/windows-NT/ChangeLog cvs-1.9/windows-NT/ChangeLog *** cvs/windows-NT/ChangeLog Wed Dec 18 21:54:08 1996 --- cvs-1.9/windows-NT/ChangeLog Wed Sep 25 12:05:16 1996 *************** *** 1,10 **** - Wed Dec 18 1996 Frits Jalvingh - * Implemented an NT popen and pclose to allow compilation for Watcom. - * Changed deep_remove_dir for independence of constants: these - are not the same for every compiler! Now we use stat etc to check - for directory/file. - - Wed Sep 25 14:31:51 1996 Jim Kingdon * options.h (TMPDIR_DFLT): Change from c:\temp to c:\\temp. --- 1,3 ---- diff -c -w -B -b -i -r cvs/windows-NT/config.h cvs-1.9/windows-NT/config.h *** cvs/windows-NT/config.h Wed Dec 18 13:59:52 1996 --- cvs-1.9/windows-NT/config.h Tue Sep 10 17:13:10 1996 *************** *** 182,192 **** /* Define if you have the header file. */ /* No, but we have the header file... */ - #ifdef __WATCOMC__ - # define HAVE_DIRENT_H 1 - #else # undef HAVE_DIRENT_H - #endif /* Define if you have the header file. */ #define HAVE_ERRNO_H 1 --- 182,188 ---- Only in cvs/windows-NT: config.h~ diff -c -w -B -b -i -r cvs/windows-NT/filesubr.c cvs-1.9/windows-NT/filesubr.c *** cvs/windows-NT/filesubr.c Wed Dec 18 21:58:22 1996 --- cvs-1.9/windows-NT/filesubr.c Wed Sep 04 09:17:38 1996 *************** *** 453,459 **** return (0); /* Win32 unlink is stupid - it fails if the file is read-only */ ! chmod (f, S_IWRITE); return (unlink (f)); } --- 453,459 ---- return (0); /* Win32 unlink is stupid - it fails if the file is read-only */ ! chmod (f, _S_IWRITE); return (unlink (f)); } *************** *** 477,483 **** return (0); /* Win32 unlink is stupid - it fails if the file is read-only */ ! chmod (f, S_IWRITE); if (unlink (f) != 0) { /* under Windows NT, unlink returns EACCES if the path --- 477,483 ---- return (0); /* Win32 unlink is stupid - it fails if the file is read-only */ ! chmod (f, _S_IWRITE); if (unlink (f) != 0) { /* under Windows NT, unlink returns EACCES if the path *************** *** 505,517 **** DIR *dirp; struct dirent *dp; char buf[PATH_MAX]; - struct stat st; - int ok; /* ENOTEMPTY for NT (obvious) but EACCES for Win95 (not obvious) */ ! if(rmdir(path) == 0) return 0; /* Try to delete directly, */ - if ((dirp = opendir (path)) == NULL) return -1; /* Exit if dir won't open, */ while ((dp = readdir (dirp)) != NULL) { if (strcmp (dp->d_name, ".") == 0 || --- 505,521 ---- DIR *dirp; struct dirent *dp; char buf[PATH_MAX]; /* ENOTEMPTY for NT (obvious) but EACCES for Win95 (not obvious) */ ! if (rmdir (path) != 0 ! && (errno == ENOTEMPTY || errno == EACCES)) ! { ! if ((dirp = opendir (path)) == NULL) ! /* If unable to open the directory return ! * an error ! */ ! return -1; while ((dp = readdir (dirp)) != NULL) { if (strcmp (dp->d_name, ".") == 0 || *************** *** 521,544 **** sprintf (buf, "%s/%s", path, dp->d_name); /* Win32 unlink is stupid - it fails if the file is read-only */ ! chmod(buf, S_IWRITE); if(unlink (buf) != 0) { ! ok = 0; ! ! /* If the unlink failed because this is a directory... */ ! if(stat(buf, &st) == 0) { ! if(st.st_mode & S_IFDIR) /* Is a directory indeed? */ { ! if(deep_remove_dir(buf) == 0) ! ok = 1; } } } } closedir (dirp); ! return ok ? rmdir(path) : -1; } /* Read NCHARS bytes from descriptor FD into BUF. --- 525,563 ---- sprintf (buf, "%s/%s", path, dp->d_name); /* Win32 unlink is stupid - it fails if the file is read-only */ ! chmod (buf, _S_IWRITE); if (unlink (buf) != 0 ) { ! /* Under Windows NT, unlink returns EACCES if the path ! is a directory. Under Windows 95, ENOENT. It ! isn't really clear to me whether checking errno is ! better or worse than using _stat to check for a directory. ! We aren't really trying to prevent race conditions here ! (e.g. what if something changes between readdir and ! unlink?) */ ! if (errno == EISDIR || errno == EACCES || errno == ENOENT) { ! if (deep_remove_dir (buf)) { ! closedir (dirp); ! return -1; } } + else + { + /* buf isn't a directory, or there are + * some sort of permision problems + */ + closedir (dirp); + return -1; + } } } closedir (dirp); ! return rmdir (path); ! } ! /* Was able to remove the directory return 0 */ ! return 0; } /* Read NCHARS bytes from descriptor FD into BUF. *************** *** 739,779 **** } - - static char *mktemp (char *string) - { - int pid, n, saved_errno; - char *s; - - pid = getpid (); - s = strchr (string, 0); - n = 0; - while (s != string && s[-1] == 'X') - { - --s; ++n; - *s = (char)(pid % 10) + '0'; - pid /= 10; - } - if (n < 2) - return NULL; - *s = 'a'; saved_errno = errno; - for (;;) - { - errno = 0; - if (access (string, 0) != 0 && errno == ENOENT) - { - errno = saved_errno; - return string; - } - if (*s == 'z') - { - errno = saved_errno; - return NULL; - } - ++*s; - } - } - /* Generate a unique temporary filename. Returns a pointer to a newly malloc'd string containing the name. Returns successfully or not at all. */ --- 758,763 ---- *************** *** 781,797 **** cvs_temp_name () { char *retval; - char pat[128]; ! strcpy(pat, "c:\\tmp\\cvsXXXXX"); ! if(mktemp(pat) != NULL) ! { ! retval = strdup(pat); ! if(retval != 0) ! return retval; ! } error (1, errno, "cannot generate temporary filename"); ! return 0; } /* Return non-zero iff FILENAME is absolute. --- 765,775 ---- cvs_temp_name () { char *retval; ! retval = _tempnam (NULL, NULL); ! if (retval == NULL) error (1, errno, "cannot generate temporary filename"); ! return retval; } /* Return non-zero iff FILENAME is absolute. diff -c -w -B -b -i -r cvs/windows-NT/run.c cvs-1.9/windows-NT/run.c *** cvs/windows-NT/run.c Wed Dec 18 21:40:39 1996 --- cvs-1.9/windows-NT/run.c Fri May 24 14:28:46 1996 *************** *** 20,26 **** #define WIN32_LEAN_AND_MEAN #include - #include #include #include #include --- 20,25 ---- *************** *** 40,77 **** #define va_dcl char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8; #endif - - #ifdef TEST - # define xmalloc(x) malloc(x) - # define xfree(x) free(x) - # define xrealloc(x,y) realloc(x,y) - # define xstrdup(x) strdup(x) - int trace = 1; - int noexec = 0; - - void error(int x, int er, char* msg, ...) - { - va_list args; - - printf("*error(%u, %u): ", x, er); - va_start(args, msg); - vprintf(msg, args); - va_end(args); - exit(1); - } - - #endif - - static void run_add_arg PROTO((const char *s)); static void run_init_prog PROTO((void)); extern char *strtok (); - FILE* popen (const char *Command, const char *mode); - int pclose(FILE*); - - /* * To exec a program under CVS, first call run_setup() to setup any initial * arguments. The options to run_setup are essentially like printf(). The --- 39,49 ---- *************** *** 421,427 **** double quotes. */ { char *requoted = requote (cmd); ! FILE *result = _popen (requoted, mode); free (requoted); return result; } --- 392,398 ---- double quotes. */ { char *requoted = requote (cmd); ! FILE *result = popen (requoted, mode); free (requoted); return result; } *************** *** 508,514 **** else write = inheritable (write); ! if (read == INVALID_HANDLE_VALUE || write == INVALID_HANDLE_VALUE) { CloseHandle (read); CloseHandle (write); --- 479,486 ---- else write = inheritable (write); ! if (read == INVALID_HANDLE_VALUE ! || write == INVALID_HANDLE_VALUE) { CloseHandle (read); CloseHandle (write); *************** *** 552,558 **** init_si (&si); si.hStdInput = in; si.hStdOutput = out; ! si.hStdError = (HANDLE) _os_handle (2); si.dwFlags = STARTF_USESTDHANDLES; status = CreateProcess ((LPCTSTR) NULL, --- 525,531 ---- init_si (&si); si.hStdInput = in; si.hStdOutput = out; ! si.hStdError = (HANDLE) _get_osfhandle (2); si.dwFlags = STARTF_USESTDHANDLES; status = CreateProcess ((LPCTSTR) NULL, *************** *** 590,718 **** /* The _spawn and _cwait functions in the C runtime library seem to operate on raw NT handles, not PID's. Odd, but we'll deal. */ - CloseHandle(pi. hThread); /* Must close the thread handle */ - return (int) pi.hProcess; } - /****************************************************************************/ - /* */ - /* POPEN and PCLOSE for NT. */ - /* */ - /****************************************************************************/ - struct ListItem - { - struct ListItem* next; - ULONG key; - ULONG val; - }; - - static struct ListItem *Handle_ll = NULL; - - static void keyAdd(ULONG key, ULONG val) - { - struct ListItem* l = xmalloc(sizeof(struct ListItem)); - l->key = key; - l->val = val; - l->next = Handle_ll; - Handle_ll = l; - } - - static ULONG keyDel(ULONG key) - { - /* Deletes the key, and returns the value. */ - struct ListItem** lp, *l; - ULONG val; - - for(lp = &Handle_ll; *lp != 0; lp = & (*lp)->next) - { - l = *lp; - if(l->key == key) - { - val = l->val; - *lp = l->next; - free(l); - return val; - } - } - return 0; - } - - - /* - * Routine: popen - * Returns: FILE pointer to pipe. - * Action : Exec program connected via pipe, connect a FILE * to the - * pipe and return it. - * Params : Command - Program to run - * Mode - Mode to open pipe. "r" implies pipe is connected - * to the programs stdout, "w" connects to stdin. - */ - FILE *popen(const char *Command, const char *mode) - { - int child; - HANDLE pipe[2]; - int ph; - FILE* f; - char nmode[5]; - - if(*mode == 'r') - { - if(my_pipe(pipe, inherit_writing) == -1) return NULL; - child = start_child (Command, GetStdHandle(STD_INPUT_HANDLE), pipe[1]); - CloseHandle(pipe[1]); /* *we* do not use it, */ - } - else - { - if(my_pipe(pipe, inherit_reading) == -1) return NULL; - child = start_child (Command, pipe[0], GetStdHandle(STD_OUTPUT_HANDLE)); - CloseHandle(pipe[0]); - } - if (child == (int) INVALID_HANDLE_VALUE) - return NULL; - - - /* Now open a file* to the pipe part used, */ - if(*mode == 'r') - ph = _hdopen((long) pipe[0], O_BINARY | O_RDWR); - else - ph = _hdopen((long) pipe[1], O_BINARY | O_RDWR); - - *nmode = *mode; - strcpy(nmode+1, "b"); - f = fdopen(ph, nmode); - if(f == 0) - { - close(ph); - return NULL; - } - keyAdd(ph, child); - return f; - } - - - /* - * Routine: pclose - * Returns: -1 on error (process terminated abnormally) or the exitstatus of - * the process. - * Action : Close a pipe opened with popen(); - * Params : Pipe - pipe to close - */ - int pclose (FILE *Pipe) - { - HANDLE pid = (HANDLE) keyDel(fileno(Pipe)); /* Get NT's process handle, */ - DWORD status; - - fclose(Pipe); /* Always close the pipe handle, */ - if(pid == 0) return -1; - - /* Now wait for the attached process to complete. */ - WaitForSingleObject(pid, INFINITE); /* Wait for the handle to be signaled */ - GetExitCodeProcess(pid, &status); - CloseHandle(pid); /* Release handle! */ - return status; - } - /* Given an array of arguments that one might pass to spawnv, construct a command line that one might pass to CreateProcess. --- 563,571 ---- *************** *** 819,826 **** /* Given the pipe handles, turn them into file descriptors for use by the caller. */ ! if ((*to = _hdopen ((long) pipein[1], _O_BINARY)) == -1 ! || (*from = _hdopen ((long) pipeout[0], _O_BINARY)) == -1) return -1; return child; --- 672,679 ---- /* Given the pipe handles, turn them into file descriptors for use by the caller. */ ! if ((*to = _open_osfhandle ((long) pipein[1], _O_BINARY)) == -1 ! || (*from = _open_osfhandle ((long) pipeout[0], _O_BINARY)) == -1) return -1; return child; *************** *** 848,854 **** int newfd; /* Get the OS handle associated with oldfd, to be passed to the child. */ ! if( (int)(oldfd_handle = (HANDLE) _os_handle (oldfd)) < 0) error (1, errno, "cannot _get_osfhandle"); if (dir) --- 701,707 ---- int newfd; /* Get the OS handle associated with oldfd, to be passed to the child. */ ! if ((oldfd_handle = (HANDLE) _get_osfhandle (oldfd)) < 0) error (1, errno, "cannot _get_osfhandle"); if (dir) *************** *** 882,888 **** newfd_handle = pipe[1]; } ! if ((newfd = _hdopen ((long) newfd_handle, _O_BINARY)) == -1) error (1, errno, "cannot _open_osfhandle"); if (pidp) --- 735,741 ---- newfd_handle = pipe[1]; } ! if ((newfd = _open_osfhandle ((long) newfd_handle, _O_BINARY)) == -1) error (1, errno, "cannot _open_osfhandle"); if (pidp) *************** *** 900,984 **** close_on_exec (int fd) { } - - - #ifdef TEST - - void keyPrint() - { - struct ListItem* l; - int i; - - if(Handle_ll == 0) - printf("Empty list.\n"); - else - for(i = 0, l = Handle_ll; l != 0; i++, l = l->next) - { - printf("entry %u: key=%lu, val=%lu\n", i, l->key, l->val); - } - } - - - void - main () - { - FILE *fp1, *fp2, *fp3; - int c; - - keyPrint (); - fp1 = popen ("make --version", "r"); - if(fp1 == 0) perror("gcc failed"); - keyPrint (); - - #if 1 - fp2 = popen ("link386 /?", "r"); - if(fp2 == 0) perror("link386 failed"); - keyPrint (); - fp3 = popen ("dir", "r"); - if(fp3 == 0) perror("DIR failed"); - keyPrint (); - #endif - - printf("--------- Pipe 1 ------------\n"); - if(fp1) - while ((c = getc (fp1)) != EOF) - printf ("%c", c); - #if 1 - printf("--------- Pipe 2 ------------\n"); - if(fp2) - while ((c = getc (fp2)) != EOF) - printf ("%c", c); - - printf("--------- Pipe 3 ------------\n"); - if(fp3) - while ((c = getc (fp3)) != EOF) - printf ("%c", c); - #endif - - if(fp1) pclose (fp1); - keyPrint (); - - #if 1 - if(fp2) pclose (fp2); - keyPrint (); - if(fp3) pclose (fp3); - keyPrint (); - #endif - return; - } - - #endif - - - - - - - - - - - - - - --- 753,755 ---- Only in cvs/windows-NT: run.c~ Only in cvs/windows-NT: tcmnt.tcm diff -c -w -B -b -i -r cvs/windows-NT/waitpid.c cvs-1.9/windows-NT/waitpid.c *** cvs/windows-NT/waitpid.c Wed Dec 18 14:41:51 1996 --- cvs-1.9/windows-NT/waitpid.c Wed Aug 30 13:44:18 1995 *************** *** 18,23 **** /* We don't know how to deal with any options yet. */ assert (options == 0); ! return cwait (statusp, pid, WAIT_CHILD); } - --- 18,22 ---- /* We don't know how to deal with any options yet. */ assert (options == 0); ! return _cwait (statusp, pid, _WAIT_CHILD); } Only in cvs/windows-NT: waitpid.c~ diff -c -w -B -b -i -r cvs/windows-NT/win32.c cvs-1.9/windows-NT/win32.c *** cvs/windows-NT/win32.c Wed Dec 18 18:12:38 1996 --- cvs-1.9/windows-NT/win32.c Fri Feb 23 16:33:02 1996 *************** *** 55,61 **** fflush (stderr); for (i = 0; i < sizeof (pwd_buf) - 1; ++i) { ! pwd_buf[i] = getch (); if (pwd_buf[i] == '\r') break; } --- 55,61 ---- fflush (stderr); for (i = 0; i < sizeof (pwd_buf) - 1; ++i) { ! pwd_buf[i] = _getch (); if (pwd_buf[i] == '\r') break; } Only in cvs/windows-NT: win32.c~ ----------------------------------------------------------- jalving@ibm.net -----------------------------------------------------------