/* * Initialize a drive. */ int idopen(dev_t dev, int flags, int fmt, struct proc *p) { struct ida_drv *drv; int part = dkpart(dev); int unit = dkunit(dev); struct disklabel label; int err; if (unit >= NID || part >= MAXPARTITIONS) /* bounds check */ return(ENXIO); drv = id_drive[unit]; if (!drv || !(drv->flags & ID_INIT)) /* drive not initialised */ return(ENXIO); drv->flags |= ID_DEV_OPEN; /* knock up a label for the whole disk. */ bzero(&label, sizeof label); label.d_secsize = u_unpack(drv->drv_info.secsize); label.d_nsectors = u_unpack(drv->drv_info.nsectors); label.d_ntracks = u_unpack(drv->drv_info.ntracks); label.d_ncylinders = u_unpack(drv->drv_info.ncylinders); label.d_secpercyl = u_unpack(drv->drv_info.ntracks) * u_unpack(drv->drv_info.nsectors); if (label.d_secpercyl == 0) label.d_secpercyl = 100; /* prevent accidental division by zero */ label.d_secperunit = u_unpack(drv->drv_info.secperunit); /* Initialize slice tables. */ if ((err = dsopen("id", dev, fmt, 0, &drv->slices, &label, idstrategy, (ds_setgeom_t *)NULL, &id_cdevsw)) == NULL) { return 0; } if (!dsisopen(drv->slices)) { drv->flags &= ~ID_DEV_OPEN; } return err; }
static int usalo_open(SCSI *usalp, char *device) { int busno = usal_scsibus(usalp); int tgt = usal_target(usalp); int tlun = usal_lun(usalp); register int f; register int b; register int t; register int l; register int nopen = 0; char devname[64]; if (busno >= MAX_SCG || tgt >= MAX_TGT || tlun >= MAX_LUN) { errno = EINVAL; if (usalp->errstr) snprintf(usalp->errstr, SCSI_ERRSTR_SIZE, "Illegal value for busno, target or lun '%d,%d,%d'", busno, tgt, tlun); return (-1); } if ((device != NULL && *device != '\0') || (busno == -2 && tgt == -2)) { errno = EINVAL; if (usalp->errstr) snprintf(usalp->errstr, SCSI_ERRSTR_SIZE, "Open by 'devname' not supported on this OS"); return (-1); } if (usalp->local == NULL) { usalp->local = malloc(sizeof (struct usal_local)); if (usalp->local == NULL) return (0); for (b = 0; b < MAX_SCG; b++) { for (t = 0; t < MAX_TGT; t++) { for (l = 0; l < MAX_LUN; l++) usallocal(usalp)->usalfiles[b][t][l] = (short)-1; } } } if (busno >= 0 && tgt >= 0 && tlun >= 0) { snprintf(devname, sizeof (devname), "/dev/scsi/sc%dd%dl%d", busno, tgt, tlun); #ifdef USE_DSLIB dsp = dsopen(devname, O_RDWR); if (dsp == 0) return (-1); #else f = open(devname, O_RDWR); if (f < 0) { if (usalp->errstr) snprintf(usalp->errstr, SCSI_ERRSTR_SIZE, "Cannot open '%s'", devname); return (-1); } usallocal(usalp)->usalfiles[busno][tgt][tlun] = f; #endif return (1); } else { #ifdef USE_DSLIB return (-1); #else for (b = 0; b < MAX_SCG; b++) { for (t = 0; t < MAX_TGT; t++) { /* for (l = 0; l < MAX_LUN; l++) {*/ for (l = 0; l < 1; l++) { snprintf(devname, sizeof (devname), "/dev/scsi/sc%dd%dl%d", b, t, l); f = open(devname, O_RDWR); if (f >= 0) { usallocal(usalp)->usalfiles[b][t][l] = (short)f; nopen++; } } } } #endif } return (nopen); }