- 论坛徽章:
- 0
|
#ifndef BBSIZE
#define BBSIZE 8192 /* size of boot area, with label */
#endif
#ifndef NUMBOOT
#define NUMBOOT 0
#endif
char *dkname, *specname;
char tmpfil[] = _PATH_TMPFILE;
char namebuf[BBSIZE], *np = namebuf;
struct disklabel lab;
char bootarea[BBSIZE];
#if NUMBOOT > 0
int installboot; /* non-zero if we should install a boot program */
char *bootbuf; /* pointer to buffer with remainder of boot prog */
int bootsize; /* size of remaining boot program */
char *xxboot; /* primary boot */
char *bootxx; /* secondary boot */
char boot0[MAXPATHLEN];
#if NUMBOOT > 1
char boot1[MAXPATHLEN];
#endif
#endif
enum {
UNSPEC, EDIT, EDITOR, READ, RESTORE, SETWRITEABLE, WRITE, WRITEBOOT
} op = UNSPEC;
int cflag;
int dflag;
int rflag;
int tflag;
int nwflag;
int verbose;
int donothing;
#ifdef DOSLABEL
struct dos_partition *dosdp; /* DOS partition, if found */
struct dos_partition *readmbr(int);
#endif
void makedisktab(FILE *, struct disklabel *);
void makelabel(char *, char *, struct disklabel *);
int writelabel(int, char *, struct disklabel *);
void l_perror(char *);
int edit(struct disklabel *, int);
int editit(void);
char *skip(char *);
char *word(char *);
int getasciilabel(FILE *, struct disklabel *);
int cmplabel(struct disklabel *, struct disklabel *);
void setbootflag(struct disklabel *);
void usage(void);
u_int32_t getnum(char *, u_int32_t, u_int32_t, const char **);
int
main(int argc, char *argv[])
{
int ch, f, writeable, error = 0;
char *fstabfile = NULL;
struct disklabel *lp;
char print_unit = 0;
FILE *t;
while ((ch = getopt(argc, argv, "BEf:NRWb:cdenp:rs:tvw")) != -1)
switch (ch) {
#if NUMBOOT > 0
case 'B': /* 安装引导记录的标志 */
++installboot;
break;
case 'b': /* primary boot */
xxboot = optarg;
break;
#if NUMBOOT > 1
case 's': /* 两级启动的第二级bootcode, secondary boot */
bootxx = optarg;
break;
#endif
#endif
case 'N': /*Disallow writing of the pack label area on the selected disk.*/
if (op != UNSPEC)
usage();
writeable = 0; /* 指定不可写磁盘 */
op = SETWRITEABLE;
break;
case 'R': /*从ASCI文件中恢复disklabel */
if (op != UNSPEC)
usage();
op = RESTORE;
break;
case 'W': /* 允许写的标志 */
if (op != UNSPEC)
usage();
writeable = 1;
op = SETWRITEABLE;
break;
case 'c': /* 根据磁盘的label信息,重新初始化内核中的label信息
++cflag;
break;
case 'd': /* use default label. */
++dflag;
break;
case 'e': /* 修改一个已经存在的label */
if (op != UNSPEC)
usage();
op = EDIT;
break;
case 'E': /* 使用内建的编辑器编辑磁盘的label,add,del,modify */
if (op != UNSPEC)
usage();
op = EDITOR;
break;
case 'f': /* 指定临时文件(fstab格式)的名字 */
fstabfile = optarg;
break;
case 'r': /* direct flag, 把label信息直接写到磁盘或从磁盘读出 */
++rflag;
break;
case 't': /*Format the label as a disktab(5) entry. */
++tflag;
break;
case 'w': /* 写label */
if (op != UNSPEC)
usage();
op = WRITE;
break;
case 'p': /* 单位*/
if (strchr("bckmg", optarg[0]) == NULL ||
optarg[1] != '\0')
usage();
print_unit = optarg[0];
break;
case 'n':
donothing++;
break;
case 'v':
verbose++;
break;
case '?':
default:
usage();
}
argc -= optind;
argv += optind;
#if NUMBOOT > 0
if (installboot) {
rflag++;
if (op == UNSPEC)
op = WRITEBOOT;
} else {
if (op == UNSPEC)
op = READ;
}
#else
if (op == UNSPEC)
op = READ;
#endif
if (argc 1 || (rflag && cflag + dflag > 0) ||
(fstabfile && op != EDITOR))
usage();
dkname = argv[0]; /*磁盘的名称*/
f = opendev(dkname, (op == READ ? O_RDONLY : O_RDWR), OPENDEV_PART,
&specname);
if (f 0)
err(4, "%s", specname);
#ifdef DOSLABEL
/*
* Check for presence of DOS partition table in
* master boot record. Return pointer to OpenBSD
* partition, if present. If no valid partition table,
* return 0. If valid partition table present, but no
* partition to use, return a pointer to a non-386bsd
* partition.
*/
dosdp = readmbr(f);
#endif
switch (op) {
case EDIT:
if (argc != 1) /* 编辑已经存在的Label,用-e指定,后面只能跟一个磁盘参数*/
usage();
if ((lp = readlabel(f)) == NULL)
exit(1); /* readlabel 获取disklabel结构 */
error = edit(lp, f);
break;
case EDITOR:
if (argc != 1)
usage();
if ((lp = readlabel(f)) == NULL)
exit(1);
error = editor(lp, f, specname, fstabfile);
/* editor()函数用于建立磁盘的label */
break;
case READ:
if (argc != 1)
usage();
if ((lp = readlabel(f)) == NULL)
exit(1);
if (tflag)
makedisktab(stdout, lp);
else
display(stdout, lp, NULL, print_unit, 0, 0);
error = checklabel(lp);
break;
case RESTORE:
if (argc 2 || argc > 3)
usage();
#if NUMBOOT > 0
if (installboot && argc == 3)
makelabel(argv[2], NULL, &lab);
#endif
lp = makebootarea(bootarea, &lab, f);
if (!(t = fopen(argv[1], "r")))
err(4, "%s", argv[1]);
if (getasciilabel(t, lp))
error = writelabel(f, bootarea, lp);
else
error = 1;
fclose(t);
break;
case SETWRITEABLE:
if (!donothing) {
if (ioctl(f, DIOCWLABEL, (char *)&writeable) 0)
err(4, "ioctl DIOCWLABEL");
}
break;
case WRITE:
if (argc 2 || argc > 3)
usage();
makelabel(argv[1], argc == 3 ? argv[2] : NULL, &lab);
lp = makebootarea(bootarea, &lab, f);
*lp = lab;
if (checklabel(lp) == 0)
error = writelabel(f, bootarea, lp);
break;
#if NUMBOOT > 0
case WRITEBOOT:
{
struct disklabel tlab;
if ((lp = readlabel(f)) == NULL)
exit(1);
tlab = *lp;
if (argc == 2)
makelabel(argv[1], NULL, &lab);
lp = makebootarea(bootarea, &lab, f);
*lp = tlab;
if (checklabel(lp) == 0)
error = writelabel(f, bootarea, lp);
break;
}
#endif
default:
break;
}
exit(error);
}
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/31277/showart_256703.html |
|