Message-Id: <3.0.1.32.19971015165621.0069d4d4@yacker.xiotech.com> Date: Wed, 15 Oct 1997 16:56:21 -0500 To: djgpp-workers AT delorie DOT com From: Randy Maas Subject: 971009: FileSysExt's Rev D. p5 Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=====================_876970581==_" Precedence: bulk --=====================_876970581==_ Content-Type: text/plain; charset="us-ascii" The .c file diffs There are a lot of them. Randy Maas randym AT acm DOT org --=====================_876970581==_ Content-Type: text/plain; charset="us-ascii" Content-Disposition: attachment; filename="_close.dif" diff -c src\libc\dos\io\_close.c _close.c *** \local\src\libc\dos\io\_close.c Sat Nov 25 18:47:06 1995 --- \local\ginsu\diffs\_close.c Wed Oct 15 16:19:24 1997 *************** *** 1,9 ! /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ ! #include ! #include ! #include ! #include ! #include #include #include --- 1,8 ----- ! /* ! emulates _close ! ! 1997, Randall Maas rewrote this calls to use __FSEXT_Call ! */ #include *************** *** 6,12 #include #include - #include int _close(int handle) --- 5,10 ----- */ #include #include *************** *** 8,15 #include ! int ! _close(int handle) { __dpmi_regs r; --- 6,14 ----- #include ! #include ! ! int _close(int handle) { return __FSEXT_Call(__FSEXT_close, handle, &handle); *************** *** 11,17 int _close(int handle) { - __dpmi_regs r; __FSEXT_Function *func = __FSEXT_get_function(handle); if (func) --- 10,15 ----- int _close(int handle) { return __FSEXT_Call(__FSEXT_close, handle, &handle); } *************** *** 13,33 { __dpmi_regs r; ! __FSEXT_Function *func = __FSEXT_get_function(handle); ! if (func) ! { ! int rv; ! if (func(__FSEXT_close, &rv, &handle)) ! return rv; ! } ! ! r.h.ah = 0x3e; ! r.x.bx = handle; ! __dpmi_int(0x21, &r); ! if (r.x.flags & 1) ! { ! errno = EBADF; ! return -1; ! } ! return 0; } --- 11,16 ----- int _close(int handle) { ! return __FSEXT_Call(__FSEXT_close, handle, &handle); } *************** *** 31,33 } return 0; } --- 13,16 ----- return __FSEXT_Call(__FSEXT_close, handle, &handle); } + --=====================_876970581==_ Content-Type: text/plain; charset="us-ascii" Content-Disposition: attachment; filename="_creat.dif" diff -c src\libc\dos\io\_creat.c _creat.c *** \local\src\libc\dos\io\_creat.c Sat Aug 31 21:09:32 1996 --- \local\ginsu\diffs\_creat.c Wed Oct 15 16:19:22 1997 *************** *** 1,4 ! /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include #include #include --- 1,6 ----- ! /* ! 1997, Randall Maas. Remove MSDOS specific code. Inlined documentation. ! Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include #include #include *************** *** 4,10 #include #include #include - #include #include #include --- 6,11 ----- #include #include #include #include #include *************** *** 8,15 #include #include ! int ! _creat(const char* filename, int attrib) { __dpmi_regs r; int rv; --- 9,18 ----- #include #include ! ! #include ! ! int _creat(const char* path, int attrib) { int rv; *************** *** 11,17 int _creat(const char* filename, int attrib) { ! __dpmi_regs r; int rv; unsigned use_lfn = _USE_LFN; --- 14,20 ----- int _creat(const char* path, int attrib) { ! int rv; if (path == 0) *************** *** 13,19 { __dpmi_regs r; int rv; - unsigned use_lfn = _USE_LFN; if (filename == 0) { --- 16,21 ----- { int rv; if (path == 0) { *************** *** 15,21 int rv; unsigned use_lfn = _USE_LFN; ! if (filename == 0) { errno = EINVAL; return -1; --- 17,23 ----- int rv; ! if (path == 0) { errno = EINVAL; return -1; *************** *** 21,27 return -1; } ! if (__FSEXT_call_open_handlers(__FSEXT_creat, &rv, &filename)) return rv; _put_path(filename); --- 23,29 ----- return -1; } ! if (__FSEXT_call_open_handlers(__FSEXT_creat, &rv, &path)) return rv; errno = EINVAL; /* The file was not created */ *************** *** 24,47 if (__FSEXT_call_open_handlers(__FSEXT_creat, &rv, &filename)) return rv; ! _put_path(filename); ! if(use_lfn) { ! r.x.ax = 0x716c; ! r.x.bx = 0x0002; /* open r/w */ ! r.x.dx = 0x0012; /* Create, truncate if exists */ ! r.x.si = __tb_offset; ! } else { ! r.h.ah = 0x3c; ! r.x.dx = __tb_offset; ! } ! r.x.cx = attrib; ! r.x.ds = __tb_segment; ! __dpmi_int(0x21, &r); ! if(r.x.flags & 1) ! { ! errno = __doserr_to_errno(r.x.ax); ! return -1; ! } ! __file_handle_set(r.x.ax, O_BINARY); ! return r.x.ax; } --- 26,32 ----- if (__FSEXT_call_open_handlers(__FSEXT_creat, &rv, &path)) return rv; ! errno = EINVAL; /* The file was not created */ ! return -1; } *************** *** 45,47 __file_handle_set(r.x.ax, O_BINARY); return r.x.ax; } --- 29,32 ----- errno = EINVAL; /* The file was not created */ return -1; } + --=====================_876970581==_ Content-Type: text/plain; charset="us-ascii" Content-Disposition: attachment; filename="_open.dif" diff -c src\libc\dos\io\_open.c _open.c *** \local\src\libc\dos\io\_open.c Sat Aug 31 21:09:32 1996 --- \local\ginsu\diffs\_open.c Wed Oct 15 16:19:22 1997 *************** *** 1,3 /* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include --- 1,4 ----- + /* 1997, Randall Maas remove DOS specific code and inlined documentation. */ /* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include *************** *** 6,12 #include #include #include - #include #include #include --- 7,12 ----- #include #include #include #include #include *************** *** 10,17 #include #include ! int ! _open(const char* filename, int oflag) { __dpmi_regs r; int rv; --- 10,19 ----- #include #include ! ! #include ! ! int _open(const char* filename, int attrib) { int rv; *************** *** 13,19 int _open(const char* filename, int oflag) { ! __dpmi_regs r; int rv; int use_lfn = _USE_LFN; --- 15,21 ----- int _open(const char* filename, int attrib) { ! int rv; if (__FSEXT_call_open_handlers(__FSEXT_open, &rv, &filename)) *************** *** 15,21 { __dpmi_regs r; int rv; - int use_lfn = _USE_LFN; if (filename == 0) { --- 17,22 ----- { int rv; if (__FSEXT_call_open_handlers(__FSEXT_open, &rv, &filename)) return rv; *************** *** 17,28 int rv; int use_lfn = _USE_LFN; - if (filename == 0) - { - errno = EINVAL; - return -1; - } - if (__FSEXT_call_open_handlers(__FSEXT_open, &rv, &filename)) return rv; --- 18,23 ----- int rv; if (__FSEXT_call_open_handlers(__FSEXT_open, &rv, &filename)) return rv; *************** *** 26,50 if (__FSEXT_call_open_handlers(__FSEXT_open, &rv, &filename)) return rv; ! _put_path(filename); ! if(use_lfn) { ! r.x.ax = 0x716c; ! r.x.bx = oflag & 0xff; ! r.x.dx = 1; /* Open existing file */ ! r.x.si = __tb_offset; ! } else { ! r.h.ah = 0x3d; ! r.h.al = oflag; ! r.x.dx = __tb_offset; ! } ! r.x.cx = 0; ! r.x.ds = __tb_segment; ! __dpmi_int(0x21, &r); ! if(r.x.flags & 1) ! { ! errno = __doserr_to_errno(r.x.ax); ! return -1; ! } ! __file_handle_set(r.x.ax, O_BINARY); ! return r.x.ax; } --- 21,26 ----- if (__FSEXT_call_open_handlers(__FSEXT_open, &rv, &filename)) return rv; ! errno = EINVAL; ! return -1; } --=====================_876970581==_ Content-Type: text/plain; charset="us-ascii" Content-Disposition: attachment; filename="_read.dif" diff -c src\libc\dos\io\_read.c _read.c *** \local\src\libc\dos\io\_read.c Sat Nov 25 16:48:30 1995 --- \local\ginsu\diffs\_read.c Wed Oct 15 16:19:24 1997 *************** *** 1,11 ! /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ ! #include ! #include ! #include ! #include ! #include ! #include ! #include #include #include --- 1,8 ----- ! /* ! emulates _read ! ! 1997, Randall Maas rewrote this calls to use __FSEXT_Call ! */ #include *************** *** 8,14 #include #include - #include int _read(int handle, void* buffer, size_t count) --- 5,10 ----- */ #include #include *************** *** 10,17 #include ! int ! _read(int handle, void* buffer, size_t count) { size_t j, k; int ngot; --- 6,14 ----- #include ! #include ! ! ssize_t _read(int handle, void* buf, size_t nbytes) { return __FSEXT_Call(__FSEXT_read, handle, &handle); *************** *** 13,22 int _read(int handle, void* buffer, size_t count) { - size_t j, k; - int ngot; - unsigned long tbsize; - __dpmi_regs r; __FSEXT_Function *func = __FSEXT_get_function(handle); if (func) --- 10,15 ----- ssize_t _read(int handle, void* buf, size_t nbytes) { return __FSEXT_Call(__FSEXT_read, handle, &handle); } *************** *** 18,52 unsigned long tbsize; __dpmi_regs r; ! __FSEXT_Function *func = __FSEXT_get_function(handle); ! if (func) ! { ! int rv; ! if (func(__FSEXT_read, &rv, &handle)) ! return rv; ! } ! ! tbsize = _go32_info_block.size_of_transfer_buffer; ! ngot = 0; ! do { ! j = (count <= tbsize) ? count : tbsize; ! r.x.ax = 0x3f00; ! r.x.bx = handle; ! r.x.cx = j; ! r.x.dx = __tb & 15; ! r.x.ds = __tb / 16; ! __dpmi_int(0x21, &r); ! if(r.x.flags & 1) ! { ! errno = __doserr_to_errno(r.x.ax); ! return -1; ! } ! count -= j; ! k = r.x.ax; ! ngot += k; ! if (k) ! dosmemget(__tb, k, buffer); ! buffer = (void *)((int)buffer + k); ! } while(count && j == k); /* if not == on DOS then no more */ ! return ngot; } --- 11,16 ----- ssize_t _read(int handle, void* buf, size_t nbytes) { ! return __FSEXT_Call(__FSEXT_read, handle, &handle); } *************** *** 50,52 } while(count && j == k); /* if not == on DOS then no more */ return ngot; } --- 13,16 ----- return __FSEXT_Call(__FSEXT_read, handle, &handle); } + --=====================_876970581==_ Content-Type: text/plain; charset="us-ascii" Content-Disposition: attachment; filename="_write.dif" diff -c src\libc\dos\io\_write.c _write.c *** \local\src\libc\dos\io\_write.c Thu Oct 24 22:26:26 1996 --- \local\ginsu\diffs\_write.c Wed Oct 15 16:19:24 1997 *************** *** 1,11 ! /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ ! #include ! #include ! #include ! #include ! #include ! #include ! #include #include #include --- 1,8 ----- ! /* ! emulate _write ! ! 1997, Randall Maas rewrote this calls to use __FSEXT_Call ! */ #include *************** *** 8,14 #include #include - #include int _write(int handle, const void* buffer, size_t count) --- 5,10 ----- */ #include #include *************** *** 10,22 #include - int - _write(int handle, const void* buffer, size_t count) - { - size_t j, i; - int nput; - unsigned long tbsize; - __dpmi_regs r; __FSEXT_Function *func = __FSEXT_get_function(handle); if (func) --- 6,11 ----- #include #include *************** *** 18,30 unsigned long tbsize; __dpmi_regs r; ! __FSEXT_Function *func = __FSEXT_get_function(handle); ! if (func) ! { ! int rv; ! if (func(__FSEXT_write, &rv, &handle)) ! return rv; ! } tbsize = _go32_info_block.size_of_transfer_buffer; nput = 0; --- 7,13 ----- ! #include ssize_t _write(int handle, const void* buf, size_t nbytes) { *************** *** 26,53 return rv; } ! tbsize = _go32_info_block.size_of_transfer_buffer; ! nput = 0; ! do { ! j = (count <= tbsize) ? count : tbsize; ! if (j) ! dosmemput(buffer, j, __tb); ! r.x.ax = 0x4000; ! r.x.bx = handle; ! r.x.cx = j; ! r.x.dx = __tb & 15; ! r.x.ds = __tb / 16; ! __dpmi_int(0x21, &r); ! if (r.x.flags & 1) ! { ! errno = __doserr_to_errno(r.x.ax); ! return -1; ! } ! i = r.x.ax; ! count -= i; ! buffer = (void *)((int)buffer + i); ! nput += i; ! } while(count && (i == j)); if (count && nput == 0) { --- 9,16 ----- #include ! ssize_t _write(int handle, const void* buf, size_t nbytes) ! { return __FSEXT_Call(__FSEXT_write, handle, &handle); } *************** *** 49,59 nput += i; } while(count && (i == j)); ! if (count && nput == 0) ! { ! errno = ENOSPC; ! return -1; ! } ! ! return nput; } --- 12,17 ----- ssize_t _write(int handle, const void* buf, size_t nbytes) { ! return __FSEXT_Call(__FSEXT_write, handle, &handle); } *************** *** 57,59 return nput; } --- 14,17 ----- return __FSEXT_Call(__FSEXT_write, handle, &handle); } + --=====================_876970581==_ Content-Type: text/plain; charset="us-ascii" Content-Disposition: attachment; filename="dup2.dif" diff -c src\libc\posix\unistd\dup2.c dup2.c *** \local\src\libc\posix\unistd\dup2.c Sun Sep 29 09:20:56 1996 --- \local\ginsu\diffs\dup2.c Wed Oct 15 16:19:24 1997 *************** *** 1,6 ! /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ ! #include ! #include #include #include #include --- 1,6 ----- ! /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details ! 1997, Randall Maas: carved it to pieces. ! */ #include #include *************** *** 2,9 #include #include #include - #include - #include #include #include --- 2,7 ----- 1997, Randall Maas: carved it to pieces. */ #include #include *************** *** 5,11 #include #include #include - #include int dup2(int fd, int newfd) --- 3,8 ----- */ #include #include #include *************** *** 7,14 #include #include ! int ! dup2(int fd, int newfd) { __dpmi_regs r; if (fd == newfd) --- 4,12 ----- #include #include ! ! #include ! int dup2(int existing_handle, int new_handle) { if (existing_handle == new_handle) *************** *** 10,28 int dup2(int fd, int newfd) { ! __dpmi_regs r; ! if (fd == newfd) ! return newfd; ! __file_handle_set(newfd, __file_handle_modes[fd] ^ (O_BINARY|O_TEXT)); ! r.h.ah = 0x46; ! r.x.bx = fd; ! r.x.cx = newfd; ! __dpmi_int(0x21, &r); ! if (r.x.flags & 1) ! { ! errno = __doserr_to_errno(r.x.ax); ! return -1; ! } ! setmode(newfd, __file_handle_modes[fd]); ! return newfd; } --- 8,15 ----- #include int dup2(int existing_handle, int new_handle) { ! ! if (existing_handle == new_handle) ! return new_handle; ! return _dup2(existing_handle, new_handle); } --=====================_876970581==_ Content-Type: text/plain; charset="us-ascii" Content-Disposition: attachment; filename="fse_open.dif" diff -c src\libc\fsext\fse_open.c fse_open.c *** \local\src\libc\fsext\fse_open.c Sat Nov 25 18:49:58 1995 --- \local\ginsu\diffs\fse_open.c Wed Oct 15 16:19:22 1997 *************** *** 1,4 ! /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include #include --- 1,5 ----- ! /* 1997, some modifications by Randall Maas ! Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include # if defined(__DJGPP__) # include *************** *** 1,6 /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include ! #include typedef struct FuncList { struct FuncList *next; --- 1,12 ----- /* 1997, some modifications by Randall Maas Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include ! # if defined(__DJGPP__) ! # include ! # else ! # include "fsext.h" ! # endif ! # include typedef struct FuncList { *************** *** 2,8 #include #include ! typedef struct FuncList { struct FuncList *next; __FSEXT_Function *function; } FuncList; --- 8,15 ----- # endif # include ! typedef struct FuncList ! { struct FuncList *next; __FSEXT_Function *function; } FuncList; *************** *** 9,16 static FuncList *func_list = 0; ! int ! __FSEXT_add_open_handler(__FSEXT_Function *_function) { FuncList *new_func_list = (FuncList *)malloc(sizeof(FuncList)); if (new_func_list == 0) --- 16,23 ----- static FuncList *func_list = 0; ! ! int __FSEXT_add_open_handler(__FSEXT_Function *_function) { FuncList *new_func_list = (FuncList *)malloc(sizeof(FuncList)); *************** *** 12,17 int __FSEXT_add_open_handler(__FSEXT_Function *_function) { FuncList *new_func_list = (FuncList *)malloc(sizeof(FuncList)); if (new_func_list == 0) return 1; --- 19,25 ----- int __FSEXT_add_open_handler(__FSEXT_Function *_function) { + FuncList *new_func_list = (FuncList *)malloc(sizeof(FuncList)); if (new_func_list == 0) return 1; *************** *** 21,29 return 0; } ! int ! __FSEXT_call_open_handlers(__FSEXT_Fnumber _function_number, ! int *rv, va_list _args) { FuncList *f; for (f=func_list; f; f=f->next) --- 29,37 ----- return 0; } ! ! int __FSEXT_call_open_handlers(__FSEXT_Fnumber _function_number, ! int *rv, va_list _args) { FuncList *f; *************** *** 25,30 __FSEXT_call_open_handlers(__FSEXT_Fnumber _function_number, int *rv, va_list _args) { FuncList *f; for (f=func_list; f; f=f->next) if (f->function(_function_number, rv, _args)) --- 33,39 ----- int __FSEXT_call_open_handlers(__FSEXT_Fnumber _function_number, int *rv, va_list _args) { + FuncList *f; for (f=func_list; f; f=f->next) if (f->function(_function_number, rv, _args, NULL)) *************** *** 27,33 { FuncList *f; for (f=func_list; f; f=f->next) ! if (f->function(_function_number, rv, _args)) return 1; return 0; } --- 36,42 ----- FuncList *f; for (f=func_list; f; f=f->next) ! if (f->function(_function_number, rv, _args, NULL)) return 1; /* If the open handlers did not emulate it, call our default extension */ *************** *** 29,33 for (f=func_list; f; f=f->next) if (f->function(_function_number, rv, _args)) return 1; return 0; } --- 38,50 ----- for (f=func_list; f; f=f->next) if (f->function(_function_number, rv, _args, NULL)) return 1; + + /* If the open handlers did not emulate it, call our default extension */ + if (_def_fsext(_function_number, rv, _args, NULL)) return 1; + + /* If the default extension did not do the job, try the emulator set */ + if (__FSEXT_Emu(_function_number, rv, _args, NULL)) return 1; + + errno = EINVAL; /* The file was not opened/created/copied*/ return 0; } --=====================_876970581==_ Content-Type: text/plain; charset="us-ascii" Content-Disposition: attachment; filename="fsext.dif" diff -c src\libc\fsext\fsext.c fsext.c *** \local\src\libc\fsext\fsext.c Sat Nov 25 17:48:12 1995 --- \local\ginsu\diffs\fsext.c Wed Oct 15 16:19:22 1997 *************** *** 1,4 ! /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include #include #include --- 1,10 ----- ! /* ! 1997, Randall Maas. Inlined documentation. ! Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details ! ! ! */ ! #include #include # if defined(__DJGPP__) *************** *** 1,8 /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include #include ! #include ! #include #include #include #include --- 7,22 ----- #include #include ! # if defined(__DJGPP__) ! # include ! # include ! # include ! # include ! # include ! # else ! # include "fsext.h" ! # endif ! # include #include # include # include *************** *** 4,12 #include #include #include ! #include ! #include ! #include static int num_fds; static __FSEXT_Function **func_list; --- 18,25 ----- # endif # include #include ! # include ! # include #if defined(__DJGPP__) extern int _DOS_alloc_fd(void); *************** *** 8,13 #include #include static int num_fds; static __FSEXT_Function **func_list; --- 21,37 ----- # include # include + #if defined(__DJGPP__) + extern int _DOS_alloc_fd(void); + # else + /* This is for non-DJGPP environments */ + int _DOS_alloc_fd() {return open("/dev/null", O_RDWR|O_CREAT);} + + # if defined(WIN32) + # define bzero(a,b) memset(a, 0, b) + # endif + #endif + static int num_fds; typedef struct *************** *** 9,15 #include static int num_fds; - static __FSEXT_Function **func_list; static void init(void) --- 33,38 ----- #endif static int num_fds; typedef struct { *************** *** 11,18 static int num_fds; static __FSEXT_Function **func_list; ! static void ! init(void) { static int init_count = -1; if (init_count == __bss_count) --- 34,40 ----- static int num_fds; ! typedef struct { __FSEXT_Function* func; /* The handler for the descriptor */ void* state_ptr; /* The handlers instance data */ *************** *** 14,19 static void init(void) { static int init_count = -1; if (init_count == __bss_count) return; --- 36,49 ----- typedef struct { + __FSEXT_Function* func; /* The handler for the descriptor */ + void* state_ptr; /* The handlers instance data */ + } __FSEXT_func_rec; + + static __FSEXT_func_rec *func_list; + + static void init(void) + { static int init_count = -1; if (init_count == __bss_count) return; *************** *** 22,29 func_list = 0; } ! int ! __FSEXT_alloc_fd(__FSEXT_Function *_function) { int fd; __dpmi_regs r; --- 52,59 ----- func_list = 0; } ! ! int __FSEXT_alloc_fd(__FSEXT_Function *_function, void* state) { int fd; *************** *** 25,30 int __FSEXT_alloc_fd(__FSEXT_Function *_function) { int fd; __dpmi_regs r; --- 55,61 ----- int __FSEXT_alloc_fd(__FSEXT_Function *_function, void* state) { + int fd; init(); *************** *** 26,32 __FSEXT_alloc_fd(__FSEXT_Function *_function) { int fd; - __dpmi_regs r; init(); --- 57,62 ----- { int fd; init(); fd = _DOS_alloc_fd(); *************** *** 29,34 __dpmi_regs r; init(); _put_path("nul"); r.x.ax = 0x3d82; /* open, no inherit, read/write */ --- 59,65 ----- int fd; init(); + fd = _DOS_alloc_fd(); __FSEXT_set_function(fd, _function, state); return fd; *************** *** 30,49 init(); ! _put_path("nul"); ! r.x.ax = 0x3d82; /* open, no inherit, read/write */ ! r.x.dx = __tb_offset; ! r.x.ds = __tb_segment; ! __dpmi_int(0x21, &r); ! ! if (r.x.flags & 1) ! { ! errno = __doserr_to_errno(r.x.ax); ! return -1; ! } ! ! fd = r.x.ax; ! __FSEXT_set_function(fd, _function); return fd; } --- 61,67 ----- init(); fd = _DOS_alloc_fd(); ! __FSEXT_set_function(fd, _function, state); return fd; } *************** *** 47,54 return fd; } ! int ! __FSEXT_set_function(int _fd, __FSEXT_Function *_function) { init(); --- 65,73 ----- return fd; } ! /* ! */ ! int __FSEXT_set_function(int _fd, __FSEXT_Function *_function, void* state) { init(); *************** *** 59,65 { int old_fds = num_fds, i; num_fds = (_fd+256) & ~255; ! func_list = (__FSEXT_Function **)realloc(func_list, num_fds * sizeof(__FSEXT_Function *)); if (func_list == 0) return 1; for (i=old_fds; i= num_fds) --- 90,101 ----- return 0; } ! /* Note: __FSEXT_get_function has same parameters and semantics as version ! 2.01. __FSEXT_get_handler will provide both the function pointer ! and the state pointer. ! */ ! ! __FSEXT_Function * __FSEXT_get_function(int _fd) { init(); *************** *** 72,77 __FSEXT_Function * __FSEXT_get_function(int _fd) { init(); if (_fd < 0 || _fd >= num_fds) return 0; --- 97,103 ----- __FSEXT_Function * __FSEXT_get_function(int _fd) { + init(); if (_fd < 0 || _fd >= num_fds) return 0; return func_list[_fd].func; *************** *** 73,78 __FSEXT_get_function(int _fd) { init(); if (_fd < 0 || _fd >= num_fds) return 0; return func_list[_fd]; --- 99,113 ----- { init(); + if (_fd < 0 || _fd >= num_fds) return 0; + return func_list[_fd].func; + } + + + int __FSEXT_get_handler(int _fd, __FSEXT_Function** func, void** state) + { + + init(); if (_fd < 0 || _fd >= num_fds) { /* Clear out func just in case */ *************** *** 74,79 { init(); if (_fd < 0 || _fd >= num_fds) ! return 0; ! return func_list[_fd]; } --- 109,124 ----- init(); if (_fd < 0 || _fd >= num_fds) ! { ! /* Clear out func just in case */ ! if (func) *func = NULL; ! return 0; ! } ! ! /* Return the parameters */ ! if (func) *func = func_list[_fd].func; ! if (state) *state = func_list[_fd].state_ptr; ! return 1; } *************** *** 77,79 return 0; return func_list[_fd]; } --- 120,136 ----- if (state) *state = func_list[_fd].state_ptr; return 1; } + + + + void __FSEXT_close_all (void) + { + + int I; + + if (!func_list) return; + for (I = 0; I < num_fds; I++) + if (func_list[I].func) + _close(I); + } + --=====================_876970581==_ Content-Type: text/plain; charset="us-ascii" Content-Disposition: attachment; filename="link.dif" diff -c src\libc\posix\unistd\link.c link.c *** \local\src\libc\posix\unistd\link.c Wed May 10 02:13:46 1995 --- \local\ginsu\diffs\link.c Wed Oct 15 16:19:26 1997 *************** *** 1,4 ! /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include #include /* For stat() */ #include /* For O_RDONLY, etc. */ --- 1,7 ----- ! /* ! 1997, Modified by Randall Maas to be a wrapper to _link. Inlined the ! documentation ! Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include #include /* For stat() */ #include /* For O_RDONLY, etc. */ *************** *** 2,8 #include #include /* For stat() */ #include /* For O_RDONLY, etc. */ - #include /* For read(), write(), etc. */ #include /* For PATH_MAX */ #include /* For utime() */ #include /* For errno */ --- 5,10 ----- #include #include /* For stat() */ #include /* For O_RDONLY, etc. */ #include /* For PATH_MAX */ #include /* For utime() */ #include /* For errno */ *************** *** 7,22 #include /* For utime() */ #include /* For errno */ - /* Of course, DOS can't really do a link. We just do a copy instead, - which is as close as DOS gets. Alternatively, we could always fail - and return -1. I think this is slightly better. */ - int - link(const char *path1, const char *path2) - { - struct stat statbuf1, statbuf2; - struct utimbuf times; - char buf[16384]; - int fd1, fd2, nbyte, status1, status2; /* Fail if either path is null */ if (path1 == NULL || path2 == NULL) --- 9,14 ----- #include /* For utime() */ #include /* For errno */ #include *************** *** 18,34 char buf[16384]; int fd1, fd2, nbyte, status1, status2; ! /* Fail if either path is null */ ! if (path1 == NULL || path2 == NULL) ! { ! errno = EFAULT; ! return -1; ! } ! if (*path1 == '\0' || *path2 == '\0') ! { ! errno = ENOENT; ! return -1; ! } /* Fail if path1 does not exist - stat() will set errno */ if (stat(path1, &statbuf1) < 0) return -1; --- 10,16 ----- #include /* For errno */ ! #include int link(const char *exists, const char *new) *************** *** 30,37 return -1; } ! /* Fail if path1 does not exist - stat() will set errno */ ! if (stat(path1, &statbuf1) < 0) return -1; /* Fail if path1 is not a regular file */ if (!S_ISREG(statbuf1.st_mode)) --- 12,18 ----- #include ! int link(const char *exists, const char *new) { *************** *** 33,44 /* Fail if path1 does not exist - stat() will set errno */ if (stat(path1, &statbuf1) < 0) return -1; ! /* Fail if path1 is not a regular file */ ! if (!S_ISREG(statbuf1.st_mode)) ! { ! errno = EPERM; ! return -1; ! } /* Fail if unable to open path1 - open() will set errno */ fd1 = open(path1, O_RDONLY | O_BINARY); --- 14,20 ----- int link(const char *exists, const char *new) ! { /* _link is defined as a File System Extension call */ return _link(exists, new); *************** *** 40,95 return -1; } ! /* Fail if unable to open path1 - open() will set errno */ ! fd1 = open(path1, O_RDONLY | O_BINARY); ! if (fd1 < 0) return -1; ! ! /* Fail if unable to create path2 - open() will set errno */ ! fd2 = open(path2, O_WRONLY | O_BINARY | O_CREAT | O_EXCL, 0600); ! if (fd2 < 0) ! { ! (void) close(fd1); ! return -1; ! } ! ! /* Fail if path1 and path2 are on different devices */ ! if (fstat(fd2, &statbuf2) < 0) return -1; ! if (statbuf1.st_dev != statbuf2.st_dev) ! { ! (void)close(fd1); ! (void)close(fd2); ! (void)unlink(path2); ! errno = EXDEV; ! return -1; ! } ! ! /* Copy path1 to path2 */ ! do ! { ! nbyte = read(fd1, buf, sizeof buf); ! if (nbyte <= 0) break; ! if (write(fd2, buf, nbyte) != nbyte) nbyte = -1; ! } ! while (nbyte > 0); ! ! /* Fail if the copy failed or we can't clean up */ ! status1 = close(fd1); ! status2 = close(fd2); ! if (nbyte < 0 || status1 < 0 || status2 < 0) ! { ! (void) unlink(path2); ! return -1; ! } ! ! /* Success! */ ! ! /* Set the mode to match the original, ignoring errors */ ! (void) chmod(path2, statbuf1.st_mode); ! ! /* Set the file time to match the original, ignoring errors */ ! times.actime = statbuf1.st_atime; ! times.modtime = statbuf1.st_mtime; ! (void) utime(path2, ×); ! ! return 0; } --- 16,22 ----- { ! /* _link is defined as a File System Extension call */ ! return _link(exists, new); } *************** *** 93,95 return 0; } --- 19,22 ----- /* _link is defined as a File System Extension call */ return _link(exists, new); } + --=====================_876970581==_ Content-Type: text/plain; charset="us-ascii" Content-Disposition: attachment; filename="lseek.dif" diff -c src\libc\posix\unistd\lseek.c lseek.c *** \local\src\libc\posix\unistd\lseek.c Sun Feb 26 19:43:10 1995 --- \local\ginsu\diffs\lseek.c Wed Oct 15 16:19:26 1997 *************** *** 1,4 ! /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include #include #include --- 1,6 ----- ! /* ! 1997, Randall Maas. Converted to a wrapper to _lseek and inlined the documentation ! Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include #include #include *************** *** 1,6 /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include - #include #include #include #include --- 2,7 ----- 1997, Randall Maas. Converted to a wrapper to _lseek and inlined the documentation Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include #include #include #include *************** *** 7,14 #include ! off_t ! lseek(int handle, off_t offset, int whence) { __dpmi_regs r; r.h.ah = 0x42; --- 8,17 ----- #include ! ! #include ! ! off_t lseek(int fd, off_t offset, int whence) { return _lseek(fd, offset, whence); *************** *** 10,26 off_t lseek(int handle, off_t offset, int whence) { ! __dpmi_regs r; ! r.h.ah = 0x42; ! r.h.al = whence; ! r.x.bx = handle; ! r.x.cx = offset >> 16; ! r.x.dx = offset & 0xffff; ! __dpmi_int(0x21, &r); ! if (r.x.flags & 1) ! { ! errno = __doserr_to_errno(r.x.ax); ! return -1; ! } ! return (r.x.dx << 16) + r.x.ax; } --- 13,19 ----- off_t lseek(int fd, off_t offset, int whence) { ! ! return _lseek(fd, offset, whence); } *************** *** 24,26 } return (r.x.dx << 16) + r.x.ax; } --- 16,19 ----- return _lseek(fd, offset, whence); } + --=====================_876970581==_ Content-Type: text/plain; charset="us-ascii" Content-Disposition: attachment; filename="pipe.dif" diff -c src\libc\posix\unistd\pipe.c pipe.c *** \local\src\libc\posix\unistd\pipe.c Sat Apr 1 18:49:02 1995 --- \local\ginsu\diffs\pipe.c Wed Oct 15 16:19:24 1997 *************** *** 1,6 ! /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ ! #include ! #include int pipe(int _fildes[2]) --- 1,7 ----- ! /* ! pipe redirector to _pipe ! 1997, Randall Maas ! */ int pipe(int filedes[2]) *************** *** 2,9 #include #include ! int ! pipe(int _fildes[2]) { errno = EACCES; return -1; --- 3,10 ----- 1997, Randall Maas */ ! ! int pipe(int filedes[2]) { _pipe(filedes); *************** *** 5,10 int pipe(int _fildes[2]) { ! errno = EACCES; ! return -1; } --- 6,12 ----- int pipe(int filedes[2]) { ! ! _pipe(filedes); ! return 0; } --=====================_876970581==_ Content-Type: text/plain; charset="us-ascii" Content-Disposition: attachment; filename="remove.dif" diff -c src\libc\ansi\stdio\remove.c remove.c *** \local\src\libc\ansi\stdio\remove.c Sat Aug 31 21:09:32 1996 --- \local\ginsu\diffs\remove.c Wed Oct 15 16:19:26 1997 *************** *** 1,6 ! /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ ! #include ! #include #include #include #include --- 1,6 ----- ! /* ! 1997, Randall Maas: Made into a wrapper for _remove, and inlined documentation ! Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include *************** *** 2,15 #include #include #include ! #include ! #include ! #include ! #include ! #include ! ! int ! remove(const char *fn) { __dpmi_regs r; unsigned attr; --- 2,10 ----- 1997, Randall Maas: Made into a wrapper for _remove, and inlined documentation Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include ! ! ! int remove(const char *file_name) { return _unlink(file_name); *************** *** 11,28 int remove(const char *fn) { - __dpmi_regs r; - unsigned attr; - int directory_p; - int use_lfn = _USE_LFN; - - /* Get the file attribute byte. */ - attr = _chmod(fn, 0); - directory_p = attr & 0x10; - - /* Now, make the file writable. We must reset Vol, Dir, Sys and Hidden bits - in addition to the Read-Only bit, or else 214301 will fail. */ - _chmod(fn, 1, attr & 0xffe0); /* Now delete it. Note, _chmod leaves dir name in tranfer buffer. */ if (directory_p) --- 6,11 ----- int remove(const char *file_name) { return _unlink(file_name); } *************** *** 24,50 in addition to the Read-Only bit, or else 214301 will fail. */ _chmod(fn, 1, attr & 0xffe0); ! /* Now delete it. Note, _chmod leaves dir name in tranfer buffer. */ ! if (directory_p) ! r.h.ah = 0x3a; /* DOS Remove Directory function */ ! else ! r.h.ah = 0x41; /* DOS Remove File function */ ! if(use_lfn) { ! r.h.al = r.h.ah; ! r.h.ah = 0x71; ! r.x.si = 0; /* No Wildcards */ ! } ! r.x.dx = __tb_offset; ! r.x.ds = __tb_segment; ! __dpmi_int(0x21, &r); ! if(r.x.flags & 1) ! { ! /* We failed. Leave the things as we've found them. */ ! int e = __doserr_to_errno(r.x.ax); ! ! _chmod(fn, 1, attr & 0xffe7); ! errno = e; ! return -1; ! } ! return 0; } --- 7,11 ----- int remove(const char *file_name) { ! return _unlink(file_name); } --=====================_876970581==_ Content-Type: text/plain; charset="us-ascii" Content-Disposition: attachment; filename="select.dif" diff -c src\libc\compat\time\select.c select.c *** \local\src\libc\compat\time\select.c Tue Jul 23 22:41:26 1996 --- \local\ginsu\diffs\select.c Wed Oct 15 16:19:22 1997 *************** *** 1,3 /* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ /* An implementation of select() --- 1,4 ----- + /* 1997, Randall Maas: inlined documentation and removed MSDOS specific code */ /* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ /* An implementation of select() *************** *** 23,30 #include #include ! inline static int ! fp_output_ready(FILE *fp) { return !ferror(fp); } --- 24,30 ----- #include #include ! inline static int fp_input_ready (FILE *fp) { /* I think if there is something in the buffer, we should return ``ready'', even if some error was encountered. Let him consume *************** *** 26,46 inline static int fp_output_ready(FILE *fp) { - return !ferror(fp); - } - - /* This is as close as we get, I think. For a file connected to a printer - we could of course go ask the BIOS, but this should be enough. */ - - inline static int - fp_except_ready(FILE *fp) - { - return ferror (fp); - } - - inline static int - fp_input_ready (FILE *fp) - { /* I think if there is something in the buffer, we should return ``ready'', even if some error was encountered. Let him consume the buffered characters, *then* return ``not ready''. */ --- 26,31 ----- inline static int fp_input_ready (FILE *fp) { /* I think if there is something in the buffer, we should return ``ready'', even if some error was encountered. Let him consume the buffered characters, *then* return ``not ready''. */ *************** *** 44,51 /* I think if there is something in the buffer, we should return ``ready'', even if some error was encountered. Let him consume the buffered characters, *then* return ``not ready''. */ ! if (fp->_cnt) ! return 1; /* The `feof' part is only correct in a single-tasked environment. */ if (ferror (fp) || feof (fp)) --- 29,35 ----- /* I think if there is something in the buffer, we should return ``ready'', even if some error was encountered. Let him consume the buffered characters, *then* return ``not ready''. */ ! if (fp->_cnt) return 1; /* The `feof' part is only correct in a single-tasked environment. */ if (ferror (fp) || feof (fp)) *************** *** 57,67 return 1; } ! /* The Dos call 4407 always returns TRUE for disk files. So the ! following really is meaningful for character devices only... */ ! ! inline static int ! fd_output_ready(int fd) { __dpmi_regs regs; --- 41,47 ----- return 1; } ! inline static int fp_output_ready(FILE *fp) { return !ferror(fp); } *************** *** 63,81 inline static int fd_output_ready(int fd) { ! ! __dpmi_regs regs; ! ! regs.x.ax = 0x4407; ! regs.x.bx = fd; ! __dpmi_int (0x21, ®s); ! if (regs.x.flags & 1) ! { ! errno = __doserr_to_errno (regs.x.ax); ! return -1; ! } ! else ! return regs.h.al == 0xff; } inline static int --- 43,49 ----- inline static int fp_output_ready(FILE *fp) { ! return !ferror(fp); } inline static int *************** *** 79,85 } inline static int ! fd_input_ready(int fd) { __dpmi_regs regs; --- 47,53 ----- } inline static int ! fp_except_ready(FILE *fp) { return ferror (fp); } *************** *** 81,99 inline static int fd_input_ready(int fd) { ! ! __dpmi_regs regs; ! ! regs.x.ax = 0x4406; ! regs.x.bx = fd; ! __dpmi_int (0x21, ®s); ! if (regs.x.flags & 1) ! { ! errno = __doserr_to_errno (regs.x.ax); ! return -1; ! } ! else ! return regs.h.al == 0xff; } int --- 49,55 ----- inline static int fp_except_ready(FILE *fp) { ! return ferror (fp); } *************** *** 96,103 return regs.h.al == 0xff; } ! int ! select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, --- 52,59 ----- return ferror (fp); } ! ! int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, *************** *** 103,108 fd_set *exceptfds, struct timeval *timeout) { int ready; fd_set oread, owrite, oexcept; struct timeval now, then; --- 59,65 ----- fd_set *exceptfds, struct timeval *timeout) { + int ready; fd_set oread, owrite, oexcept; struct timeval now, then; *************** *** 141,147 for (i = 0; i < nfds; i++) { register int ioctl_result; ! __FSEXT_Function *func = __FSEXT_get_function(i); int fsext_ready = -1; if (func) --- 98,105 ----- for (i = 0; i < nfds; i++) { register int ioctl_result; ! __FSEXT_Function *func; ! void* state; int fsext_ready = -1; if (__FSEXT_get_handler(i, &func, &state) && func) *************** *** 144,151 __FSEXT_Function *func = __FSEXT_get_function(i); int fsext_ready = -1; ! if (func) ! func(__FSEXT_ready, &fsext_ready, &i); if (readfds && FD_ISSET (i, readfds)) { --- 102,109 ----- void* state; int fsext_ready = -1; ! if (__FSEXT_get_handler(i, &func, &state) && func) ! func(__FSEXT_ready, &fsext_ready, &i, state); if (readfds && FD_ISSET (i, readfds)) { *************** *** 154,161 if (fsext_ready & __FSEXT_ready_read) ready++, FD_SET(i, &oread); } ! else if ((ioctl_result = fd_input_ready (i)) == -1) ! return -1; else if (ioctl_result) ready++, FD_SET (i, &oread); } --- 112,119 ----- if (fsext_ready & __FSEXT_ready_read) ready++, FD_SET(i, &oread); } ! /* else if ((ioctl_result = fd_input_ready (i)) == -1) ! return -1; */ else if (ioctl_result) ready++, FD_SET (i, &oread); } *************** *** 166,173 if (fsext_ready & __FSEXT_ready_write) ready++, FD_SET(i, &owrite); } ! else if ((ioctl_result = fd_output_ready (i)) == -1) ! return -1; else if (ioctl_result) ready++, FD_SET (i, &owrite); } --- 124,131 ----- if (fsext_ready & __FSEXT_ready_write) ready++, FD_SET(i, &owrite); } ! /* else if ((ioctl_result = fd_output_ready (i)) == -1) ! return -1;*/ else if (ioctl_result) ready++, FD_SET (i, &owrite); } --=====================_876970581==_ Content-Type: text/plain; charset="us-ascii" --=====================_876970581==_--