- if (ptr != 0) {
- printf("Seek not from beginning of file\n");
- errno = EOFFSET;
- return (-1);
- }
- fdesc -= 3;
- if (fdesc < 0 || fdesc >= NFILES ||
- ((io = &iob[fdesc])->i_flgs & F_ALLOC) == 0) {
- errno = EBADF;
- return (-1);
- }
- io->i_offset = addr;
- io->i_bn = addr / DEV_BSIZE;
- io->i_cc = 0;
- return (0);
-}
-
-getc(fdesc)
- int fdesc;
-{
- register struct iob *io;
- register struct fs *fs;
- register char *p;
- int c, lbn, off, size, diff;
-
-
- if (fdesc >= 0 && fdesc <= 2)
- return (getchar());
- fdesc -= 3;
- if (fdesc < 0 || fdesc >= NFILES ||
- ((io = &iob[fdesc])->i_flgs&F_ALLOC) == 0) {
- errno = EBADF;
- return (-1);
- }
- p = io->i_ma;
- if (io->i_cc <= 0) {
- if ((io->i_flgs & F_FILE) != 0) {
- diff = io->i_ino.i_size - io->i_offset;
- if (diff <= 0)
- return (-1);
- fs = &io->i_fs;
- lbn = lblkno(fs, io->i_offset);
- io->i_bn = fsbtodb(fs, sbmap(io, lbn)) + io->i_boff;
- off = blkoff(fs, io->i_offset);
- size = blksize(fs, &io->i_ino, lbn);
- } else {
- io->i_bn = io->i_offset / DEV_BSIZE;
- off = 0;
- size = DEV_BSIZE;
- }
- io->i_ma = io->i_buf;
- io->i_cc = size;
- if (devread(io) < 0) {
- errno = io->i_error;
- return (-1);
- }
- if ((io->i_flgs & F_FILE) != 0) {
- if (io->i_offset - off + size >= io->i_ino.i_size)
- io->i_cc = diff + off;
- io->i_cc -= off;
- }
- p = &io->i_buf[off];
- }
- io->i_cc--;
- io->i_offset++;
- c = (unsigned)*p++;
- io->i_ma = p;
- return (c);
-}
-
-/* does this port?
-getw(fdesc)
- int fdesc;
-{
- register w,i;
- register char *cp;
- int val;
-
- for (i = 0, val = 0, cp = &val; i < sizeof(val); i++) {
- w = getc(fdesc);
- if (w < 0) {
- if (i == 0)
- return (-1);
- else
- return (val);
- }
- *cp++ = w;
- }
- return (val);
-}
-*/
-int errno;
-
-read(fdesc, buf, count)
- int fdesc, count;
- char *buf;
-{
- register i;
- register struct iob *file;
-
- errno = 0;
- if (fdesc >= 0 & fdesc <= 2) {
- i = count;
- do {
- *buf = getchar();
- } while (--i && *buf++ != '\n');
- return (count - i);
- }
- fdesc -= 3;
- if (fdesc < 0 || fdesc >= NFILES ||
- ((file = &iob[fdesc])->i_flgs&F_ALLOC) == 0) {
- errno = EBADF;
- return (-1);
- }
- if ((file->i_flgs&F_READ) == 0) {
- errno = EBADF;
- return (-1);
- }
- if ((file->i_flgs & F_FILE) == 0) {
- file->i_cc = count;
- file->i_ma = buf;
- file->i_bn = file->i_boff + (file->i_offset / DEV_BSIZE);
- i = devread(file);
- file->i_offset += count;
- if (i < 0)
- errno = file->i_error;
- return (i);
- } else {
- if (file->i_offset+count > file->i_ino.i_size)
- count = file->i_ino.i_size - file->i_offset;
- if ((i = count) <= 0)
- return (0);
- do {
- *buf++ = getc(fdesc+3);
- } while (--i);
- return (count);
- }
-}
-
-write(fdesc, buf, count)
- int fdesc, count;
- char *buf;
-{
- register i;
- register struct iob *file;
-
- errno = 0;
- if (fdesc >= 0 && fdesc <= 2) {
- i = count;
- while (i--)
- putchar(*buf++);
- return (count);
- }
- fdesc -= 3;
- if (fdesc < 0 || fdesc >= NFILES ||
- ((file = &iob[fdesc])->i_flgs&F_ALLOC) == 0) {
- errno = EBADF;
- return (-1);
- }
- if ((file->i_flgs&F_WRITE) == 0) {
- errno = EBADF;
- return (-1);
- }
- file->i_cc = count;
- file->i_ma = buf;
- file->i_bn = file->i_boff + (file->i_offset / DEV_BSIZE);
- i = devwrite(file);
- file->i_offset += count;
- if (i < 0)
- errno = file->i_error;
- return (i);
-}
-
-int openfirst = 1;
-
-open(str, how)
- char *str;
- int how;
-{
- register char *cp;
- int i;
- register struct iob *file;
- register struct devsw *dp;
- int fdesc;
- long atol();
-
- if (openfirst) {
- for (i = 0; i < NFILES; i++)
- iob[i].i_flgs = 0;
- openfirst = 0;
- }
-
- for (fdesc = 0; fdesc < NFILES; fdesc++)
- if (iob[fdesc].i_flgs == 0)
- goto gotfile;
- _stop("No more file slots");
-gotfile:
- (file = &iob[fdesc])->i_flgs |= F_ALLOC;
-
- for (cp = str; *cp && *cp != '('; cp++)
- ;
- if (*cp != '(') {
- printf("Bad device\n");
- file->i_flgs = 0;
- errno = EDEV;
- return (-1);
- }
- *cp++ = '\0';
- for (dp = devsw; dp->dv_name; dp++) {
- if (!strcmp(str, dp->dv_name))
- goto gotdev;
- }
- printf("Unknown device\n");
- file->i_flgs = 0;
- errno = ENXIO;
- return (-1);
-gotdev:
- *(cp-1) = '(';
- file->i_ino.i_dev = dp-devsw;
- file->i_unit = *cp++ - '0';
- if (*cp >= '0' && *cp <= '9')
- file->i_unit = file->i_unit * 10 + *cp++ - '0';
- if (file->i_unit < 0 || file->i_unit > 31) {
- printf("Bad unit specifier\n");
- file->i_flgs = 0;
- errno = EUNIT;
- return (-1);
- }
- if (*cp++ != ',') {
-badoff:
- printf("Missing offset specification\n");
- file->i_flgs = 0;
- errno = EOFFSET;
- return (-1);
- }
- file->i_boff = atol(cp);
- for (;;) {
- if (*cp == ')')
- break;
- if (*cp++)
- continue;
- goto badoff;
- }
- devopen(file);
- if (*++cp == '\0') {
- file->i_flgs |= how+1;
- file->i_cc = 0;
- file->i_offset = 0;
- return (fdesc+3);
- }
- file->i_ma = (char *)(&file->i_fs);
- file->i_cc = SBSIZE;
- file->i_bn = SBLOCK + file->i_boff;
- file->i_offset = 0;
- if (devread(file) < 0) {
- errno = file->i_error;
- printf("super block read error\n");
- return (-1);
- }
- if ((i = find(cp, file)) == 0) {
- file->i_flgs = 0;
- errno = ESRCH;
- return (-1);
- }
- if (how != 0) {
- printf("Can't write files yet.. Sorry\n");
- file->i_flgs = 0;
- errno = EIO;
- return (-1);
- }
- if (openi(i, file) < 0) {
- errno = file->i_error;
- return (-1);
- }
- file->i_offset = 0;
- file->i_cc = 0;
- file->i_flgs |= F_FILE | (how+1);
- return (fdesc+3);
-}
-
-close(fdesc)
- int fdesc;
-{
- struct iob *file;
-
- fdesc -= 3;
- if (fdesc < 0 || fdesc >= NFILES ||
- ((file = &iob[fdesc])->i_flgs&F_ALLOC) == 0) {
- errno = EBADF;
- return (-1);
- }
- if ((file->i_flgs&F_FILE) == 0)
- devclose(file);
- file->i_flgs = 0;
- return (0);
-}
-
-ioctl(fdesc, cmd, arg)
- int fdesc, cmd;
- char *arg;
-{
- register struct iob *file;
- int error = 0;
-
- fdesc -= 3;
- if (fdesc < 0 || fdesc >= NFILES ||
- ((file = &iob[fdesc])->i_flgs&F_ALLOC) == 0) {
- errno = EBADF;
- return (-1);
- }
- switch (cmd) {
-
- case SAIOHDR:
- file->i_flgs |= F_HDR;
- break;
-
- case SAIOCHECK:
- file->i_flgs |= F_CHECK;
- break;
-
- case SAIOHCHECK:
- file->i_flgs |= F_HCHECK;
- break;
-
- case SAIONOBAD:
- file->i_flgs |= F_NBSF;
- break;
-
- case SAIODOBAD:
- file->i_flgs &= ~F_NBSF;
- break;
-
- case SAIOECCLIM:
- file->i_flgs |= F_ECCLM;
- break;
-
- case SAIOECCUNL:
- file->i_flgs &= ~F_ECCLM;
- break;
-
- case SAIOSEVRE:
- file->i_flgs |= F_SEVRE;
- break;
-
- case SAIONSEVRE:
- file->i_flgs &= ~F_SEVRE;
- break;
-
- default:
- error = devioctl(file, cmd, arg);
- break;
- }
- if (error < 0)
- errno = file->i_error;
- return (error);
-}