ajm@cit5.cit.oz (Tony Mcgregor) (01/15/90)
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 <lib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#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
----------------------------------------------------------------------------