- for (fdesc = 0;; fdesc++) {
- if (fdesc == NFILES)
- _stop("No more file slots");
- if (iob[fdesc].i_flgs == 0) {
- file = &iob[fdesc];
- file->i_flgs |= F_ALLOC;
- file->i_adapt = file->i_ctlr = file->i_unit =
- file->i_part = 0;
- break;
- }
- }
-
- for (cnt = 0; cnt < sizeof(args)/sizeof(args[0]); args[cnt++] = 0);
-#ifndef SMALL
- for (t = str; *t && *t != '/' && *t != ':' && *t != '('; ++t)
- if (isupper(*t))
- *t = tolower(*t);
- switch(*t) {
- case '(': /* type(adapt, ctlr, drive, partition)file */
- if ((file->i_dev = getdev(str, t - str)) == -1)
- goto bad;
- for (argp = args + 4, cnt = 0; *t != ')'; ++cnt) {
- for (++t; isspace(*t); ++t);
- if (*t == ')')
- break;
- if (!isdigit(*t))
- goto badspec;
- *argp++ = atoi(t);
- for (++t; isdigit(*t); ++t);
- if (*t != ',' && *t != ')' || cnt == 4)
- goto badspec;
- }
- for (++t; isspace(*t); ++t);
- argp -= 4;
- file->i_adapt = *argp++;
- file->i_ctlr = *argp++;
- file->i_unit = *argp++;
- file->i_part = *argp;
- break;
- case ':': /* [A-Za-z]*[0-9]*[A-Za-z]:file */
- for (t = str; *t != ':' && !isdigit(*t); ++t);
- if ((file->i_dev = getdev(str, t - str)) == -1)
- goto bad;
- if ((file->i_unit = getunit(t)) == -1)
- goto bad;
- for (; isdigit(*t); ++t);
- if (*t >= 'a' && *t <= 'h')
- file->i_part = *t++ - 'a';
- if (*t != ':') {
- errno = EOFFSET;
- goto badspec;
- }
- for (++t; isspace(*t); ++t);
- break;
- case '/':
- default: /* default bootstrap unit and device */
-#else
- {
-#endif /* SMALL */
- file->i_dev = B_TYPE(bootdev);
- file->i_adapt = B_ADAPTOR(bootdev);
- file->i_ctlr = B_CONTROLLER(bootdev);
- file->i_unit = B_UNIT(bootdev);
- file->i_part = B_PARTITION(bootdev);
- t = str;
- }
-
- opendev = MAKEBOOTDEV(file->i_dev, file->i_adapt, file->i_ctlr,
- file->i_unit, file->i_part);
-
- if (errno = devopen(file))
- goto bad;
-
- if (*t == '\0') {
- file->i_flgs |= how + 1;
- file->i_cc = 0;
- file->i_offset = 0;
- return (fdesc+3);
- }
-#ifndef SMALL
- else if (how != 0) {
- printf("Can't write files yet.. Sorry\n");
- errno = EIO;
- goto bad;
- }
-#endif
- file->i_ma = (char *)(&file->i_fs);
- file->i_cc = SBSIZE;
- file->i_bn = SBOFF / DEV_BSIZE + file->i_boff;
- file->i_offset = 0;
- if (devread(file) < 0) {
- errno = file->i_error;
- printf("super block read error\n");
- goto bad;
- }
- if ((cnt = find(t, file)) == 0) {
- errno = ESRCH;
- goto bad;
- }
- if (openi(cnt, file) < 0) {
- errno = file->i_error;
- goto bad;
- }
- file->i_offset = 0;
- file->i_cc = 0;
- file->i_flgs |= F_FILE | (how+1);
- return (fdesc+3);
-
-#ifndef SMALL
-badspec:
- printf("malformed device specification\nusage: device(adaptor, controller, drive, partition)file\n");
-#endif
-bad:
- file->i_flgs = 0;
- return (-1);
-}
-
-#ifndef SMALL
-static
-getdev(str, len)
- register char *str;
- int len;
-{
- register struct devsw *dp;
- register int i;
- char savedch = str[len];
-
- str[len] = '\0';
- for (dp = devsw, i = 0; i < ndevs; dp++, i++)
- if (dp->dv_name && strcmp(str, dp->dv_name) == 0) {
- str[len] = savedch;
- return (i);
- }
- printf("Unknown device\nKnown devices are:\n");
- for (dp = devsw, i = 0; i < ndevs; dp++, i++)
- if (dp->dv_name)
- printf(" %s", dp->dv_name);
- printf("\n");
- errno = ENXIO;
- return (-1);
-}
-
-static
-getunit(cp)
- register char *cp;
-{
- int unit;
-
- unit = atoi(cp);
- if ((u_int)unit > 255) {
- printf("minor device number out of range (0-255)\n");
- errno = EUNIT;
- return (-1);
- }
- return (unit);
-}
-#endif /* SMALL */
-
-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);
-}
-
-#ifndef SMALL
-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;
-
- default:
- error = devioctl(file, cmd, arg);
- break;
- }
- if (error < 0)
- errno = file->i_error;
- return (error);
-}
-#endif /* SMALL */