1 /*- 2 * Copyright (c) 1992, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Ralph Campbell. 7 * 8 * %sccs.include.redist.c% 9 * 10 * @(#)devopen.c 8.1 (Berkeley) 06/10/93 11 */ 12 13 #include <stand/stand.h> 14 15 /* 16 * Decode the string 'fname', open the device and return the remaining 17 * file name if any. 18 */ 19 devopen(f, fname, file) 20 struct open_file *f; 21 char *fname; 22 char **file; /* out */ 23 { 24 register char *cp; 25 register char *ncp; 26 register struct devsw *dp; 27 register int c, i; 28 int ctlr = 0, unit = 0, part = 0; 29 char namebuf[20]; 30 int rc; 31 32 cp = fname; 33 ncp = namebuf; 34 35 /* look for a string like '5/rz0/vmunix' or '5/rz3f/vmunix */ 36 if ((c = *cp) >= '0' && c <= '9') { 37 ctlr = c - '0'; 38 /* skip the '/' */ 39 if (*++cp != '/') 40 return (ENXIO); 41 cp++; 42 while ((c = *cp) != '\0') { 43 if (c == '/') 44 break; 45 if (c >= '0' && c <= '9') { 46 /* read unit number */ 47 unit = c - '0'; 48 49 /* look for a partition */ 50 if ((c = *++cp) >= 'a' && c <= 'h') { 51 part = c - 'a'; 52 c = *++cp; 53 } 54 if (c != '/') 55 return (ENXIO); 56 break; 57 } 58 if (ncp < namebuf + sizeof(namebuf) - 1) 59 *ncp++ = c; 60 cp++; 61 } 62 } else { 63 /* expect a string like 'rz(0,0,0)vmunix' */ 64 while ((c = *cp) != '\0') { 65 if (c == '(') { 66 cp++; 67 break; 68 } 69 if (ncp < namebuf + sizeof(namebuf) - 1) 70 *ncp++ = c; 71 cp++; 72 } 73 74 /* get controller number */ 75 if ((c = *cp) >= '0' && c <= '9') { 76 ctlr = c - '0'; 77 c = *++cp; 78 } 79 80 if (c == ',') { 81 /* get SCSI device number */ 82 if ((c = *++cp) >= '0' && c <= '9') { 83 unit = c - '0'; 84 c = *++cp; 85 } 86 87 if (c == ',') { 88 /* get partition number */ 89 if ((c = *++cp) >= '0' && c <= '9') { 90 part = c - '0'; 91 c = *++cp; 92 } 93 } 94 } 95 if (c != ')') 96 return (ENXIO); 97 cp++; 98 } 99 *ncp = '\0'; 100 101 for (dp = devsw, i = 0; i < ndevs; dp++, i++) 102 if (dp->dv_name && strcmp(namebuf, dp->dv_name) == 0) 103 goto fnd; 104 printf("Unknown device '%s'\nKnown devices are:", namebuf); 105 for (dp = devsw, i = 0; i < ndevs; dp++, i++) 106 if (dp->dv_name) 107 printf(" %s", dp->dv_name); 108 printf("\n"); 109 return (ENXIO); 110 111 fnd: 112 rc = (dp->dv_open)(f, ctlr, unit, part); 113 if (rc) 114 return (rc); 115 116 f->f_dev = dp; 117 if (file && *cp != '\0') 118 *file = cp; 119 return (0); 120 } 121