meulenbr@cst.UUCP (Frans Meulenbroeks) (11/12/88)
Hi!
The current Minix/ST freopen does not do the job properly.
I've hacked my own which is better (I hope).
Feel free to share or improve it. Flames to /dev/null.
Use at own risk.
The archive is followed by exit and my signature.
Frans Meulenbroeks.
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
-----cut here-----cut here-----cut here-----cut here-----
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# freopen.c
# This archive created: Fri Nov 11 19:40:10 1988
sed 's/^X//' << \SHAR_EOF > freopen.c
X/* new freopen.c for minix/st
X hacked together: 11/11/88 by F. Meulenbroeks.
X Disclaimer: almost all of this code is extracted from fopen.c and
X fclose.c. Use at own risk.
X
X The problem with the original freopen was that it did not
X use the same FILE struct to store its values.
X This results in problems when using code like
X FILE *yyin = stdin;
X which occurs in flex.
X
X Also freopen should return the original value of stream.
X This is not the case in the minix/st freopen.
X
X The original freopen does not neccesarily return the same entry in _io_table
X if another file is closed before. This causes problems when reopening
X stderr after closing stdin or stdout (I think).
X
X I decided the when doing an freopen, one uses the same buffer and
X buffering method. ANSI C does not explicitly specify this.
X*/
X
X#include <stdio.h>
X
X#define PMODE 0644
X
XFILE *freopen(name, mode,fp)
Xchar *name , *mode;
XFILE *fp;
X{
X register int i;
X int fd, flags;
X
X for (i=0; i<NFILES; i++)
X if (fp == _io_table[i]) {
X break;
X }
X if (i >= NFILES)
X return((FILE *)EOF);
X flags = fp->_flags;
X flags = flags & !WRITEMODE & !READMODE;
X fflush(fp);
X close(fp->_fd);
X
X switch(*mode){
X
X case 'w':
X flags |= WRITEMODE;
X if (( fd = creat (name,PMODE)) < 0)
X return((FILE *)NULL);
X break;
X
X case 'a':
X flags |= WRITEMODE;
X if (( fd = open(name,1)) < 0 )
X return((FILE *)NULL);
X lseek(fd,0L,2);
X break;
X
X case 'r':
X flags |= READMODE;
X if (( fd = open (name,0)) < 0 )
X return((FILE *)NULL);
X break;
X
X default:
X return((FILE *)NULL);
X }
X
X fp->_count = 0;
X fp->_fd = fd;
X fp->_flags = flags;
X fp->_ptr = fp->_buf;
X return(fp);
X}
SHAR_EOF
# End of shell archive
exit 0
--
Frans Meulenbroeks (meulenbr@cst.prl.philips.nl)
Centre for Software Technology
( or try: ...!mcvax!philmds!prle!cst!meulenbr)katzung@laidbak.UUCP (Brian Katzung) (11/15/88)
In article <260@cst.UUCP> meulenbr@cst.UUCP (Frans Meulenbroeks) writes: >X#define PMODE 0644 Shouldn't this be 0666 so that umask can be used to get the desired mode? >X flags = flags & !WRITEMODE & !READMODE; That sets all bits to zero (perhaps those are network-mangled tildas??). I believe you meant flags &= ~(WRITEMODE | READMODE); >X case 'a': >X flags |= WRITEMODE; >X if (( fd = open(name,1)) < 0 ) >X return((FILE *)NULL); >X lseek(fd,0L,2); >X break; Append is really two attempts: if ((fd = open(name, 1)) < 0 && (fd = creat(name, PMODE)) < 0) return ((FILE *) NULL); Does Minix support O_APPEND mode? If not, perhaps there needs to be an APPENDMODE bit (see flame below) to achieve nearly the same effect. The only reference I have handy right now (SVID) guarantees writes at the end. Do the original routines support r+, w+, and a+ modes? These are nice to have. I'm not near a Minix machine at the moment. Does Minix support open with 3 arguments? This would make an implementation a little easier/cleaner. >Frans Meulenbroeks (meulenbr@cst.prl.philips.nl) > Centre for Software Technology > ( or try: ...!mcvax!philmds!prle!cst!meulenbr) VERY small flame/spark (but not aimed at Frans) on a related topic: Aren't READMODE and WRITEMODE rather "central" in the name-space for "semi-invisible" definitions? It seems to me that something like _SIO_READ and _SIO_WRITE might have been a bit less likely to collide with application definitions. -- Brian Katzung ...!spl1!laidbak!katzung
meulenbr@cstw01.UUCP (Frans Meulenbroeks) (11/18/88)
In article <1782@laidbak.UUCP> katzung@laidbak.UUCP (Brian Katzung) writes: >In article <260@cst.UUCP> meulenbr@cst.UUCP (Frans Meulenbroeks) writes: >>X#define PMODE 0644 > >Shouldn't this be 0666 so that umask can be used to get the desired mode? I've not the slightest idea! I just picked this from the original fopen.c Can one of the Minix wizards (Johan? Andy?) comment? > >>X flags = flags & !WRITEMODE & !READMODE; > >That sets all bits to zero (perhaps those are network-mangled tildas??). >I believe you meant > > flags &= ~(WRITEMODE | READMODE); > Oops: I meant: flags = flags & ~WRITEMODE & ~READMODE; The error was brain mangled, not network mangled. Note that this line of code is due to the fact that I assumed that buffering etc. stays the same during a reopen. Could not find anything to assert or deny this assumption. Anyone an idea? >>X case 'a': >>X flags |= WRITEMODE; >>X if (( fd = open(name,1)) < 0 ) >>X return((FILE *)NULL); >>X lseek(fd,0L,2); >>X break; > >Append is really two attempts: > > if ((fd = open(name, 1)) < 0 && (fd = creat(name, PMODE)) < 0) > return ((FILE *) NULL); > [ some stuff deleted] The code I sent is again copied from fopen.c > >Do the original routines support r+, w+, and a+ modes? These are nice No! I'd love to see them, but haven't had time to make them. >to have. I'm not near a Minix machine at the moment. Does Minix support >open with 3 arguments? This would make an implementation a little >easier/cleaner. Again. No. > [ small flame deleted] > >-- Brian Katzung ...!spl1!laidbak!katzung Newsgroups: comp.os.minix Subject: Re: new and improved freopen.c (I hope) Summary: Expires: References: <260@cst.UUCP> <1782@laidbak.UUCP> Sender: Reply-To: meulenbr@cstw01.UUCP (Frans Meulenbroeks) Followup-To: Distribution: Organization: Centre for Software Technology, Philips Eindhoven Keywords: In article <1782@laidbak.UUCP> katzung@laidbak.UUCP (Brian Katzung) writes: >In article <260@cst.UUCP> meulenbr@cst.UUCP (Frans Meulenbroeks) writes: >>X#define PMODE 0644 >Shouldn't this be 0666 so that umask can be used to get the desired mode? I've not the slightest idea! I just picked this from the original fopen.c Can one of the Minix wizards (Johan? Andy?) comment? >>X flags = flags & !WRITEMODE & !READMODE; >That sets all bits to zero (perhaps those are network-mangled tildas??). >I believe you meant > flags &= ~(WRITEMODE | READMODE); Oops: I meant: flags = flags & ~WRITEMODE & ~READMODE; The error was brain mangled, not network mangled. Note that this line of code is due to the fact that I assumed that buffering etc. stays the same during a reopen. Could not find anything to assert or deny this assumption. Anyone an idea? >>X case 'a': >>X flags |= WRITEMODE; >>X if (( fd = open(name,1)) < 0 ) >>X return((FILE *)NULL); >>X lseek(fd,0L,2); >>X break; >Append is really two attempts: > if ((fd = open(name, 1)) < 0 && (fd = creat(name, PMODE)) < 0) > return ((FILE *) NULL); [ some stuff deleted] The code I sent is again copied from fopen.c >Do the original routines support r+, w+, and a+ modes? These are nice No! I'd love to see them, but haven't had time to make them. >to have. I'm not near a Minix machine at the moment. Does Minix support >open with 3 arguments? This would make an implementation a little >easier/cleaner. Again. No. [ small flame deleted] >-- Brian Katzung ...!spl1!laidbak!katzung -- Frans Meulenbroeks (meulenbr@cst.prl.philips.nl) Centre for Software Technology ( or try: ...!mcvax!philmds!prle!cst!meulenbr)