121417Sdist /* 2*61111Sbostic * Copyright (c) 1983, 1987, 1993 3*61111Sbostic * The Regents of the University of California. All rights reserved. 435104Sbostic * 556242Selan * %sccs.include.redist.c% 621417Sdist */ 710748Ssam 856242Selan #ifndef lint 9*61111Sbostic static char sccsid[] = "@(#)disklabel.c 8.1 (Berkeley) 06/04/93"; 1056242Selan #endif /* not lint */ 1121417Sdist 1230420Skarels #include <sys/param.h> 1330420Skarels #define DKTYPENAMES 1430420Skarels #include <sys/disklabel.h> 1551531Sbostic #include <ufs/ffs/fs.h> 1656409Sbostic 1756409Sbostic #include <errno.h> 1856409Sbostic #include <fcntl.h> 1910748Ssam #include <stdio.h> 2056409Sbostic #include <stdlib.h> 2142022Sbostic #include <string.h> 2246597Sdonn #include <unistd.h> 2310748Ssam 2456134Selan static int error __P((int)); 2556134Selan static int gettype __P((char *, char **)); 2610748Ssam 2730420Skarels struct disklabel * 2810748Ssam getdiskbyname(name) 2946597Sdonn const char *name; 3010748Ssam { 3133399Smarc static struct disklabel disk; 3230420Skarels register struct disklabel *dp = &disk; 3310760Ssam register struct partition *pp; 3456134Selan char *buf; 3556134Selan char *db_array[2] = { _PATH_DISKTAB, 0 }; 3656134Selan char *cp, *cq; /* can't be register */ 3733399Smarc char p, max, psize[3], pbsize[3], 3833399Smarc pfsize[3], poffset[3], ptype[3]; 3933399Smarc u_long *dx; 4010748Ssam 4156134Selan if (cgetent(&buf, db_array, (char *) name) < 0) 4256134Selan return NULL; 4356134Selan 4430420Skarels bzero((char *)&disk, sizeof(disk)); 4533399Smarc /* 4633399Smarc * typename 4733399Smarc */ 4830420Skarels cq = dp->d_typename; 4930420Skarels cp = buf; 5030420Skarels while (cq < dp->d_typename + sizeof(dp->d_typename) - 1 && 5130420Skarels (*cq = *cp) && *cq != '|' && *cq != ':') 5230420Skarels cq++, cp++; 5330420Skarels *cq = '\0'; 5433399Smarc /* 5533399Smarc * boot name (optional) xxboot, bootxx 5633399Smarc */ 5756134Selan cgetstr(buf, "b0", &dp->d_boot0); 5856134Selan cgetstr(buf, "b1", &dp->d_boot1); 5956134Selan 6056134Selan if (cgetstr(buf, "ty", &cq) > 0 && strcmp(cq, "removable") == 0) 6130420Skarels dp->d_flags |= D_REMOVABLE; 6230420Skarels else if (cq && strcmp(cq, "simulated") == 0) 6330420Skarels dp->d_flags |= D_RAMDISK; 6456134Selan if (cgetcap(buf, "sf", ':') != NULL) 6530420Skarels dp->d_flags |= D_BADSECT; 6633399Smarc 6730420Skarels #define getnumdflt(field, dname, dflt) \ 6856134Selan { long f; (field) = (cgetnum(buf, dname, &f) == -1) ? (dflt) : f; } 6930420Skarels 7030420Skarels getnumdflt(dp->d_secsize, "se", DEV_BSIZE); 7156134Selan cgetnum(buf, "nt",(long *) &dp->d_ntracks); 7256134Selan cgetnum(buf, "ns",(long *) &dp->d_nsectors); 7356134Selan cgetnum(buf, "nc",(long *) &dp->d_ncylinders); 7456134Selan 7556134Selan if (cgetstr(buf, "dt", &cq) > 0) 7630420Skarels dp->d_type = gettype(cq, dktypenames); 7730420Skarels else 7830420Skarels getnumdflt(dp->d_type, "dt", 0); 7930420Skarels getnumdflt(dp->d_secpercyl, "sc", dp->d_nsectors * dp->d_ntracks); 8030420Skarels getnumdflt(dp->d_secperunit, "su", dp->d_secpercyl * dp->d_ncylinders); 8130420Skarels getnumdflt(dp->d_rpm, "rm", 3600); 8230420Skarels getnumdflt(dp->d_interleave, "il", 1); 8330420Skarels getnumdflt(dp->d_trackskew, "sk", 0); 8430420Skarels getnumdflt(dp->d_cylskew, "cs", 0); 8530420Skarels getnumdflt(dp->d_headswitch, "hs", 0); 8630420Skarels getnumdflt(dp->d_trkseek, "ts", 0); 8730420Skarels getnumdflt(dp->d_bbsize, "bs", BBSIZE); 8830420Skarels getnumdflt(dp->d_sbsize, "sb", SBSIZE); 8910760Ssam strcpy(psize, "px"); 9010760Ssam strcpy(pbsize, "bx"); 9110760Ssam strcpy(pfsize, "fx"); 9230420Skarels strcpy(poffset, "ox"); 9330420Skarels strcpy(ptype, "tx"); 9430420Skarels max = 'a' - 1; 9530420Skarels pp = &dp->d_partitions[0]; 9630420Skarels for (p = 'a'; p < 'a' + MAXPARTITIONS; p++, pp++) { 9730420Skarels psize[1] = pbsize[1] = pfsize[1] = poffset[1] = ptype[1] = p; 9856134Selan if (cgetnum(buf, psize,(long *) &pp->p_size) == -1) 9930420Skarels pp->p_size = 0; 10030420Skarels else { 10156134Selan cgetnum(buf, poffset, (long *) &pp->p_offset); 10230420Skarels getnumdflt(pp->p_fsize, pfsize, 0); 10356134Selan if (pp->p_fsize) { 10456403Sralph long bsize; 10556403Sralph 10656403Sralph if (cgetnum(buf, pbsize, &bsize) == 0) 10756403Sralph pp->p_frag = bsize / pp->p_fsize; 10856403Sralph else 10956403Sralph pp->p_frag = 8; 11056134Selan } 11130420Skarels getnumdflt(pp->p_fstype, ptype, 0); 11256134Selan if (pp->p_fstype == 0 && cgetstr(buf, ptype, &cq) > 0) 11330420Skarels pp->p_fstype = gettype(cq, fstypenames); 11430420Skarels max = p; 11530420Skarels } 11610748Ssam } 11730420Skarels dp->d_npartitions = max + 1 - 'a'; 11830681Sbostic (void)strcpy(psize, "dx"); 11930420Skarels dx = dp->d_drivedata; 12030420Skarels for (p = '0'; p < '0' + NDDATA; p++, dx++) { 12130420Skarels psize[1] = p; 12230420Skarels getnumdflt(*dx, psize, 0); 12330420Skarels } 12430420Skarels dp->d_magic = DISKMAGIC; 12530420Skarels dp->d_magic2 = DISKMAGIC; 12656134Selan free(buf); 12710748Ssam return (dp); 12810748Ssam } 12910748Ssam 13056134Selan static int 13130420Skarels gettype(t, names) 13230420Skarels char *t; 13330420Skarels char **names; 13430420Skarels { 13530420Skarels register char **nm; 13630420Skarels 13730420Skarels for (nm = names; *nm; nm++) 13833261Smckusick if (strcasecmp(t, *nm) == 0) 13930420Skarels return (nm - names); 14030420Skarels if (isdigit(*t)) 14130420Skarels return (atoi(t)); 14230420Skarels return (0); 14330420Skarels } 14430420Skarels 14556134Selan static int 14645646Sbostic error(err) 14745646Sbostic int err; 14845646Sbostic { 14945646Sbostic char *p; 15045646Sbostic 15145646Sbostic (void)write(STDERR_FILENO, "disktab: ", 9); 15245646Sbostic (void)write(STDERR_FILENO, _PATH_DISKTAB, sizeof(_PATH_DISKTAB) - 1); 15353016Sbostic (void)write(STDERR_FILENO, ": ", 2); 15445646Sbostic p = strerror(err); 15545646Sbostic (void)write(STDERR_FILENO, p, strlen(p)); 15645646Sbostic (void)write(STDERR_FILENO, "\n", 1); 15745646Sbostic } 158