Home | History | Annotate | Line # | Download | only in boot
devopen.c revision 1.5.122.1
      1  1.5.122.1  tls /*	$NetBSD: devopen.c,v 1.5.122.1 2014/08/20 00:03:17 tls Exp $	*/
      2        1.1  dbj /*
      3        1.1  dbj  * Copyright (c) 1994 Rolf Grossmann
      4        1.1  dbj  * All rights reserved.
      5        1.1  dbj  *
      6        1.1  dbj  * Redistribution and use in source and binary forms, with or without
      7        1.1  dbj  * modification, are permitted provided that the following conditions
      8        1.1  dbj  * are met:
      9        1.1  dbj  * 1. Redistributions of source code must retain the above copyright
     10        1.1  dbj  *    notice, this list of conditions and the following disclaimer.
     11        1.1  dbj  * 2. Redistributions in binary form must reproduce the above copyright
     12        1.1  dbj  *    notice, this list of conditions and the following disclaimer in the
     13        1.1  dbj  *    documentation and/or other materials provided with the distribution.
     14        1.1  dbj  * 3. All advertising materials mentioning features or use of this software
     15        1.1  dbj  *    must display the following acknowledgement:
     16        1.1  dbj  *      This product includes software developed by Rolf Grossmann.
     17        1.1  dbj  * 4. The name of the author may not be used to endorse or promote products
     18        1.1  dbj  *    derived from this software without specific prior written permission
     19        1.1  dbj  *
     20        1.1  dbj  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     21        1.1  dbj  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     22        1.1  dbj  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     23        1.1  dbj  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     24        1.1  dbj  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     25        1.1  dbj  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26        1.1  dbj  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27        1.1  dbj  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28        1.1  dbj  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     29        1.1  dbj  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30        1.1  dbj  */
     31        1.1  dbj 
     32        1.1  dbj #include <lib/libsa/stand.h>
     33        1.1  dbj #include <lib/libkern/libkern.h>
     34        1.2  dbj 
     35        1.3  chs int devlookup(const char *, int);
     36        1.3  chs int devparse(const char *, int *, char *, char *, char *, char **);
     37        1.1  dbj 
     38        1.1  dbj int
     39        1.1  dbj devlookup(const char *d, int len)
     40        1.1  dbj {
     41        1.1  dbj     struct devsw *dp = devsw;
     42        1.1  dbj     int i;
     43        1.1  dbj 
     44        1.1  dbj     for (i = 0; i < ndevs; i++, dp++)
     45        1.1  dbj 	if (dp->dv_name && strncmp(dp->dv_name, d, len) == 0)
     46        1.1  dbj 	    return i;
     47        1.1  dbj 
     48        1.1  dbj     for (i = 0; i < len; i++)
     49        1.1  dbj 	printf("%c", d[i]);
     50        1.1  dbj     printf(": no such device - Configured devices are:\n");
     51        1.1  dbj     for (dp = devsw, i = 0; i < ndevs; i++, dp++)
     52        1.1  dbj 	if (dp->dv_name && (void *)dp->dv_open != (void *)nodev)
     53        1.1  dbj 	    printf(" %s", dp->dv_name);
     54        1.1  dbj     printf("\n");
     55        1.1  dbj     errno = ENXIO;
     56        1.1  dbj     return -1;
     57        1.1  dbj }
     58        1.1  dbj 
     59        1.1  dbj /*
     60        1.1  dbj  * Parse a device spec.
     61        1.1  dbj  *
     62        1.1  dbj  * Format:
     63        1.1  dbj  *   dev(count, lun, part)file
     64        1.1  dbj  */
     65        1.1  dbj int
     66        1.1  dbj devparse(const char *fname, int *dev,
     67        1.1  dbj 	 char *count, char *lun, char *part, char **file)
     68        1.1  dbj {
     69        1.1  dbj     int i;
     70        1.1  dbj     const char *s, *args[3];
     71        1.1  dbj 
     72        1.1  dbj     /* get device name */
     73        1.1  dbj     for (s = fname; *s && *s != '/' && *s != '('; s++)
     74        1.1  dbj 	;
     75        1.1  dbj 
     76        1.1  dbj     if (*s == '(') {
     77        1.1  dbj 	/* lookup device and get index */
     78        1.1  dbj 	if ((*dev = devlookup(fname, s - fname)) < 0)
     79        1.1  dbj 	    goto baddev;
     80        1.1  dbj 
     81        1.1  dbj 	/* tokenize device ident */
     82        1.1  dbj 	args[0] = ++s;
     83        1.1  dbj 	for (i = 1; *s && *s != ')' && i<3; s++) {
     84        1.1  dbj 	    if (*s == ',')
     85        1.1  dbj 		args[i++] = ++s;
     86        1.1  dbj 	}
     87        1.1  dbj 	if (*s != ')')
     88        1.1  dbj 	    goto baddev;
     89        1.1  dbj 
     90        1.1  dbj 	switch(i) {
     91        1.1  dbj 	  case 3:
     92        1.1  dbj 	      *count  = atoi(args[0]);
     93        1.1  dbj 	      *lun  = atoi(args[1]);
     94        1.1  dbj 	      *part  = atoi(args[2]);
     95        1.1  dbj 	      break;
     96        1.1  dbj 	  case 2:
     97        1.1  dbj 	      *lun  = atoi(args[0]);
     98        1.1  dbj 	      *part  = atoi(args[1]);
     99        1.1  dbj 	      break;
    100        1.1  dbj 	  case 1:
    101        1.1  dbj 	      *part  = atoi(args[0]);
    102        1.1  dbj 	      break;
    103        1.1  dbj 	  case 0:
    104        1.1  dbj 	      break;
    105        1.1  dbj 	}
    106        1.1  dbj 	*file = (char *)++s;	/* XXX discard const */
    107        1.1  dbj     }
    108        1.1  dbj     /* no device present */
    109        1.1  dbj     else
    110        1.1  dbj 	*file = (char *)fname;	/* XXX discard const */
    111        1.1  dbj 
    112        1.1  dbj     return 0;
    113        1.1  dbj 
    114        1.1  dbj baddev:
    115        1.1  dbj     return ENXIO;
    116        1.1  dbj }
    117        1.1  dbj 
    118        1.1  dbj int
    119        1.1  dbj devopen(struct open_file *f, const char *fname, char **file)
    120        1.1  dbj {
    121        1.1  dbj     int error;
    122        1.1  dbj     int dev;
    123        1.1  dbj     char count, lun, part;
    124        1.1  dbj     struct devsw *dp;
    125        1.1  dbj 
    126        1.1  dbj     dev   = 0;	/* default device is first in table (usually scsi disk) */
    127        1.1  dbj     count = 0;
    128        1.1  dbj     lun   = 0;
    129        1.1  dbj     part  = 0;
    130        1.1  dbj 
    131        1.1  dbj     if ((error = devparse(fname, &dev, &count, &lun, &part, file)) != 0)
    132        1.1  dbj 	return error;
    133        1.1  dbj 
    134        1.1  dbj     dp = &devsw[dev];
    135        1.1  dbj 
    136        1.1  dbj     if ((void *)dp->dv_open == (void *)nodev)
    137        1.1  dbj 	return ENXIO;
    138        1.1  dbj 
    139        1.1  dbj     f->f_dev = dp;
    140        1.1  dbj 
    141        1.1  dbj     if ((error = (*dp->dv_open)(f, count, lun, part)) != 0)
    142        1.1  dbj 	printf("%s(%d,%d,%d): %d = %s\n", devsw[dev].dv_name,
    143        1.1  dbj 	       count, lun, part, error, strerror(error));
    144        1.1  dbj 
    145        1.1  dbj     return error;
    146        1.1  dbj }
    147