* Copyright (c) 1983 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid
[] = "@(#)disklabel.c 5.3 (Berkeley) %G%";
#endif LIBC_SCCS and not lint
static struct disktab disk
;
static char localbuf
[100], *cp
= localbuf
;
register struct disktab
*dp
= &disk
;
register struct partition
*pp
;
char p
, psize
[3], pbsize
[3], pfsize
[3];
if (dgetent(buf
, name
) <= 0)
return ((struct disktab
*)0);
dp
->d_type
= dgetstr("ty", &cp
);
dp
->d_secsize
= dgetnum("se");
dp
->d_ntracks
= dgetnum("nt");
dp
->d_nsectors
= dgetnum("ns");
dp
->d_ncylinders
= dgetnum("nc");
dp
->d_rpm
= dgetnum("rm");
dp
->d_badsectforw
= dgetflag("sf");
dp
->d_sectoffset
= dgetflag("so");
for (p
= 'a'; p
< 'i'; p
++) {
psize
[1] = pbsize
[1] = pfsize
[1] = p
;
pp
= &dp
->d_partitions
[p
- 'a'];
pp
->p_size
= dgetnum(psize
);
pp
->p_bsize
= dgetnum(pbsize
);
pp
->p_fsize
= dgetnum(pfsize
);
* Get an entry for disk name in buffer bp,
* from the diskcap file. Parse is very rudimentary;
* we just notice escaped newlines.
register int i
= 0, cnt
= 0;
cnt
= read(tf
, ibuf
, BUFSIZ
);
if (cp
> bp
&& cp
[-1] == '\\'){
write(2,"Disktab entry too long\n", 23);
* The real work for the match.
* Dnamatch deals with name matching. The first field of the disktab
* entry is a sequence of names separated by |'s, so we compare
* against each such name. The normal : terminator after the last
* name (before the first field) stops us.
for (Np
= np
; *Np
&& *Bp
== *Np
; Bp
++, Np
++)
if (*Np
== 0 && (*Bp
== '|' || *Bp
== ':' || *Bp
== 0))
while (*Bp
&& *Bp
!= ':' && *Bp
!= '|')
if (*Bp
== 0 || *Bp
== ':')
* Skip to the next field. Notice that this is very dumb, not
* knowing about \: escapes or any such. If necessary, :'s can be put
* into the diskcap file in octal.
while (*bp
&& *bp
!= ':')
* Return the (numeric) option id.
* Numeric options look like
* i.e. the option string is separated from the numeric value by
* a # character. If the option is not found we return -1.
* Note that we handle octal numbers beginning with 0.
register char *bp
= tbuf
;
if (*bp
++ != id
[0] || *bp
== 0 || *bp
++ != id
[1])
i
*= base
, i
+= *bp
++ - '0';
* Flag options are given "naked", i.e. followed by a : or the end
* of the buffer. Return 1 if we find the option, or 0 if it is
register char *bp
= tbuf
;
if (*bp
++ == id
[0] && *bp
!= 0 && *bp
++ == id
[1]) {
* Get a string valued option.
* Much decoding is done on the strings, and the strings are
* placed in area, which is a ref parameter which is updated.
* No checking on area overflow.
register char *bp
= tbuf
;
if (*bp
++ != id
[0] || *bp
== 0 || *bp
++ != id
[1])
return (ddecode(bp
, area
));
* Tdecode does the grung work to decode the
* string capability escapes.
while ((c
= *str
++) && c
!= ':') {
dp
= "E\033^^\\\\::n\nr\rt\tb\bf\f";
c
<<= 3, c
|= *str
++ - '0';
while (--i
&& isdigit(*str
));