免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1202 | 回复: 0

disklable.c [复制链接]

论坛徽章:
0
发表于 2007-03-10 23:29 |显示全部楼层

                                                                #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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP