Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!uwm.edu!zaphod.mps.ohio-state.edu!samsung!munnari.oz.au!murtoa.cs.mu.oz.au!ditmela!yarra!cit5!ajm From: ajm@cit5.cit.oz (Tony Mcgregor) Newsgroups: comp.os.minix Subject: Bug in portio.c + fix Message-ID: <1990Jan14.234734.2692@cit5.cit.oz> Date: 14 Jan 90 23:47:34 GMT Organization: Chisholm Institute of Technology, Melb., Australia Lines: 112 There is a bug in the 1.5.0 lib/other/portio.c that means port reads and writes can't be mixed within a single program. This caused a problem with readclock. A fix follows. #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # portio.c # portio.crc # This archive created: Mon Jan 15 10:43:38 1990 export PATH; PATH=/bin:/usr/bin:$PATH if test -f 'portio.c' then echo shar: "will not over-write existing file 'portio.c'" else cat << \SHAR_EOF > 'portio.c' /* Port i/o functions using /dev/port. * Callers now ought to check the return values. * Calling either of these functions consumes a file descriptor. */ #include #include #include #include #define P_READ 1 #define P_WRITE 2 PRIVATE int portfd = -1; PRIVATE int mode_opened = 0; int port_in(port, valuep) unsigned port; unsigned *valuep; { unsigned char chvalue; if ( !( mode_opened & P_READ )) { if ( mode_opened & P_WRITE ) { close(portfd); portfd = open("/dev/port", O_RDWR); } else { portfd = open("/dev/port", O_RDONLY); } mode_opened |= P_READ ; } if (portfd < 0 || lseek(portfd, (long) port, 0) < 0 || read(portfd, (char *) &chvalue, (size_t) 1) != 1) return(*valuep = -1); return(*valuep = chvalue); } int port_out(port, value) unsigned port; unsigned value; { unsigned char chvalue; chvalue = value; if ( !( mode_opened & P_WRITE )) { if ( mode_opened & P_READ ) { close(portfd); portfd = open("/dev/port", O_RDWR); } else { portfd = open("/dev/port", O_WRONLY); } mode_opened |= P_WRITE ; } if (portfd < 0 || lseek(portfd, (long) port, 0) < 0 || write(portfd, (char *) &chvalue, (size_t) 1) != 1) return(-1); return(chvalue); } SHAR_EOF fi if test -f 'portio.crc' then echo shar: "will not over-write existing file 'portio.crc'" else cat << \SHAR_EOF > 'portio.crc' CRCS: 61685 1345 1.5.0_portio.c 20209 1350 fixed_portio.c SHAR_EOF fi exit 0 # End of shell archive PS Please forgive me if I stuffed-up; this is my first posting. ---------------------------------------------------------------------------- Tony McGregor Department of Robotics and Digital Tech., Chisholm Institute of Technology PO Box 197, Caulfield East, Vic 3145, Australia Phone: +61 3 5732014 Fax: +61 3 5732748 ACSNET: ajm@cit5.cit.oz ----------------------------------------------------------------------------