📄 fdisksgilabel.c
字号:
int sortcount = 0; /* number of used partitions, i.e. non-zero lengths */ int entire = 0, i = 0; unsigned int start = 0; long long gap = 0; /* count unused blocks */ unsigned int lastblock = sgi_get_lastblock(); clearfreelist(); for (i=0; i<16; i++) { if (sgi_get_num_sectors(i) != 0) { Index[sortcount++]=i; if (sgi_get_sysid(i) == ENTIRE_DISK) { if (entire++ == 1) { if (verbose) printf(_("More than one entire disk entry present.\n")); } } } } if (sortcount == 0) { if (verbose) printf(_("No partitions defined\n")); return (lastblock > 0) ? 1 : (lastblock == 0) ? 0 : -1; } qsort(Index, sortcount, sizeof(Index[0]), (void*)compare_start); if (sgi_get_sysid(Index[0]) == ENTIRE_DISK) { if ((Index[0] != 10) && verbose) printf(_("IRIX likes when Partition 11 covers the entire disk.\n")); if ((sgi_get_start_sector(Index[0]) != 0) && verbose) printf(_("The entire disk partition should start " "at block 0,\n" "not at diskblock %d.\n"), sgi_get_start_sector(Index[0])); if (debug) /* I do not understand how some disks fulfil it */ if ((sgi_get_num_sectors(Index[0]) != lastblock) && verbose) printf(_("The entire disk partition is only %d diskblock large,\n" "but the disk is %d diskblocks long.\n"), sgi_get_num_sectors(Index[0]), lastblock); lastblock = sgi_get_num_sectors(Index[0]); } else { if (verbose) printf(_("One Partition (#11) should cover the entire disk.\n")); if (debug>2) printf("sysid=%d\tpartition=%d\n", sgi_get_sysid(Index[0]), Index[0]+1); } for (i=1, start=0; i<sortcount; i++) { int cylsize = sgi_get_nsect() * sgi_get_ntrks(); if ((sgi_get_start_sector(Index[i]) % cylsize) != 0) { if (debug) /* I do not understand how some disks fulfil it */ if (verbose) printf(_("Partition %d does not start on cylinder boundary.\n"), Index[i]+1); } if (sgi_get_num_sectors(Index[i]) % cylsize != 0) { if (debug) /* I do not understand how some disks fulfil it */ if (verbose) printf(_("Partition %d does not end on cylinder boundary.\n"), Index[i]+1); } /* We cannot handle several "entire disk" entries. */ if (sgi_get_sysid(Index[i]) == ENTIRE_DISK) continue; if (start > sgi_get_start_sector(Index[i])) { if (verbose) printf(_("The Partition %d and %d overlap by %d sectors.\n"), Index[i-1]+1, Index[i]+1, start - sgi_get_start_sector(Index[i])); if (gap > 0) gap = -gap; if (gap == 0) gap = -1; } if (start < sgi_get_start_sector(Index[i])) { if (verbose) printf(_("Unused gap of %8u sectors - sectors %8u-%u\n"), sgi_get_start_sector(Index[i]) - start, start, sgi_get_start_sector(Index[i])-1); gap += sgi_get_start_sector(Index[i]) - start; add2freelist(start, sgi_get_start_sector(Index[i])); } start = sgi_get_start_sector(Index[i]) + sgi_get_num_sectors(Index[i]); if (debug > 1) { if (verbose) printf("%2d:%12d\t%12d\t%12d\n", Index[i], sgi_get_start_sector(Index[i]), sgi_get_num_sectors(Index[i]), sgi_get_sysid(Index[i])); } } if (start < lastblock) { if (verbose) printf(_("Unused gap of %8u sectors - sectors %8u-%u\n"), lastblock - start, start, lastblock-1); gap += lastblock - start; add2freelist(start, lastblock); } /* * Done with arithmetics * Go for details now */ if (verbose) { if (!sgi_get_num_sectors(sgi_get_bootpartition())) { printf(_("\nThe boot partition does not exist.\n")); } if (!sgi_get_num_sectors(sgi_get_swappartition())) { printf(_("\nThe swap partition does not exist.\n")); } else { if ((sgi_get_sysid(sgi_get_swappartition()) != SGI_SWAP) && (sgi_get_sysid(sgi_get_swappartition()) != LINUX_SWAP)) printf(_("\nThe swap partition has no swap type.\n")); } if (sgi_check_bootfile("/unix")) printf(_("\tYou have chosen an unusual boot file name.\n")); } return (gap > 0) ? 1 : (gap == 0) ? 0 : -1;}voidsgi_change_sysid(int i, int sys){ if (sgi_get_num_sectors(i) == 0) /* caught already before, ... */ { printf(_("Sorry You may change the Tag of non-empty partitions.\n")); return; } if (((sys != ENTIRE_DISK) && (sys != SGI_VOLHDR)) && (sgi_get_start_sector(i)<1)) { read_chars( _("It is highly recommended that the partition at offset 0\n" "is of type \"SGI volhdr\", the IRIX system will rely on it to\n" "retrieve from its directory standalone tools like sash and fx.\n" "Only the \"SGI volume\" entire disk section may violate this.\n" "Type YES if you are sure about tagging this partition differently.\n")); if (strcmp (line_ptr, _("YES\n"))) return; } sgilabel->partitions[i].id = SSWAP32(sys);}/* returns partition index of first entry marked as entire disk */static intsgi_entire(void) { int i; for (i=0; i<16; i++) if (sgi_get_sysid(i) == SGI_VOLUME) return i; return -1;}static voidsgi_set_partition(int i, unsigned int start, unsigned int length, int sys) { sgilabel->partitions[i].id = SSWAP32(sys); sgilabel->partitions[i].num_sectors = SSWAP32(length); sgilabel->partitions[i].start_sector = SSWAP32(start); set_changed(i); if (sgi_gaps() < 0) /* rebuild freelist */ printf(_("Do You know, You got a partition overlap on the disk?\n"));}static voidsgi_set_entire(void) { int n; for (n=10; n<partitions; n++) { if (!sgi_get_num_sectors(n)) { sgi_set_partition(n, 0, sgi_get_lastblock(), SGI_VOLUME); break; } }}staticvoidsgi_set_volhdr(void){ int n; for (n=8; n<partitions; n++) { if (!sgi_get_num_sectors(n)) { /* * Choose same default volume header size * as IRIX fx uses. */ if (4096 < sgi_get_lastblock()) sgi_set_partition(n, 0, 4096, SGI_VOLHDR); break; } }}voidsgi_delete_partition(int i){ sgi_set_partition(i, 0, 0, 0);}voidsgi_add_partition(int n, int sys){ char mesg[256]; unsigned int first=0, last=0; if (n == 10) { sys = SGI_VOLUME; } else if (n == 8) { sys = 0; } if (sgi_get_num_sectors(n)) { printf(_("Partition %d is already defined. Delete " "it before re-adding it.\n"), n + 1); return; } if ((sgi_entire() == -1) && (sys != SGI_VOLUME)) { printf(_("Attempting to generate entire disk entry automatically.\n")); sgi_set_entire(); sgi_set_volhdr(); } if ((sgi_gaps() == 0) && (sys != SGI_VOLUME)) { printf(_("The entire disk is already covered with partitions.\n")); return; } if (sgi_gaps() < 0) { printf(_("You got a partition overlap on the disk. Fix it first!\n")); return; } snprintf(mesg, sizeof(mesg), _("First %s"), str_units(SINGULAR)); for (;;) { if (sys == SGI_VOLUME) { last = sgi_get_lastblock(); first = read_int(0, 0, last-1, 0, mesg); if (first != 0) { printf(_("It is highly recommended that eleventh partition\n" "covers the entire disk and is of type `SGI volume'\n")); } } else { first = freelist[0].first; last = freelist[0].last; first = read_int(scround(first), scround(first), scround(last)-1, 0, mesg); } if (display_in_cyl_units) first *= units_per_sector; else first = first; /* align to cylinder if you know how ... */ if (!last) last = isinfreelist(first); if (last == 0) { printf(_("You will get a partition overlap on the disk. " "Fix it first!\n")); } else break; } snprintf(mesg, sizeof(mesg), _(" Last %s"), str_units(SINGULAR)); last = read_int(scround(first), scround(last)-1, scround(last)-1, scround(first), mesg)+1; if (display_in_cyl_units) last *= units_per_sector; else last = last; /* align to cylinder if You know how ... */ if ((sys == SGI_VOLUME) && (first != 0 || last != sgi_get_lastblock())) printf(_("It is highly recommended that eleventh partition\n" "covers the entire disk and is of type `SGI volume'\n")); sgi_set_partition(n, first, last-first, sys);}voidcreate_sgilabel(void){ struct hd_geometry geometry; struct { unsigned int start; unsigned int nsect; int sysid; } old[4]; int i=0; unsigned long long llsectors; int res; /* the result from the ioctl */ int sec_fac; /* the sector factor */ sec_fac = sector_size / 512; /* determine the sector factor */ fprintf(stderr, _("Building a new SGI disklabel. Changes will remain in memory only,\n" "until you decide to write them. After that, of course, the previous\n" "content will be unrecoverably lost.\n\n")); other_endian = (BYTE_ORDER == LITTLE_ENDIAN); res = disksize(fd, &llsectors); if (!ioctl(fd, HDIO_GETGEO, &geometry)) { heads = geometry.heads; sectors = geometry.sectors; if (res == 0) { /* the get device size ioctl was successful */ unsigned long long llcyls; llcyls = llsectors / (heads * sectors * sec_fac); cylinders = llcyls; if (cylinders != llcyls) /* truncated? */ cylinders = ~0; } else { /* otherwise print error and use truncated version */ cylinders = geometry.cylinders; fprintf(stderr, _("Warning: BLKGETSIZE ioctl failed on %s. " "Using geometry cylinder value of %d.\n" "This value may be truncated for devices" " > 33.8 GB.\n"), disk_device, cylinders); } } for (i = 0; i < 4; i++) { old[i].sysid = 0; if (valid_part_table_flag(MBRbuffer)) { if (get_part_table(i)->sys_ind) { old[i].sysid = get_part_table(i)->sys_ind; old[i].start = get_start_sect(get_part_table(i)); old[i].nsect = get_nr_sects(get_part_table(i)); printf(_("Trying to keep parameters of partition %d.\n"), i); if (debug) printf(_("ID=%02x\tSTART=%d\tLENGTH=%d\n"), old[i].sysid, old[i].start, old[i].nsect); } } } memset(MBRbuffer, 0, sizeof(MBRbuffer)); sgilabel->magic = SSWAP32(SGI_LABEL_MAGIC); sgilabel->boot_part = SSWAP16(0); sgilabel->swap_part = SSWAP16(1); /* sizeof(sgilabel->boot_file) = 16 > 6 */ memset(sgilabel->boot_file, 0, 16); strcpy(sgilabel->boot_file, "/unix"); sgilabel->devparam.skew = (0); sgilabel->devparam.gap1 = (0); sgilabel->devparam.gap2 = (0); sgilabel->devparam.sparecyl = (0); sgilabel->devparam.pcylcount = SSWAP16(geometry.cylinders); sgilabel->devparam.head_vol0 = SSWAP16(0); sgilabel->devparam.ntrks = SSWAP16(geometry.heads); /* tracks/cylinder (heads) */ sgilabel->devparam.cmd_tag_queue_depth = (0); sgilabel->devparam.unused0 = (0); sgilabel->devparam.unused1 = SSWAP16(0); sgilabel->devparam.nsect = SSWAP16(geometry.sectors); /* sectors/track */ sgilabel->devparam.bytes = SSWAP16(512); sgilabel->devparam.ilfact = SSWAP16(1); sgilabel->devparam.flags = SSWAP32(TRACK_FWD|\ IGNORE_ERRORS|RESEEK); sgilabel->devparam.datarate = SSWAP32(0); sgilabel->devparam.retries_on_error = SSWAP32(1); sgilabel->devparam.ms_per_word = SSWAP32(0); sgilabel->devparam.xylogics_gap1 = SSWAP16(0); sgilabel->devparam.xylogics_syncdelay = SSWAP16(0); sgilabel->devparam.xylogics_readdelay = SSWAP16(0); sgilabel->devparam.xylogics_gap2 = SSWAP16(0); sgilabel->devparam.xylogics_readgate = SSWAP16(0); sgilabel->devparam.xylogics_writecont = SSWAP16(0); memset(&(sgilabel->directory), 0, sizeof(struct volume_directory)*15); memset(&(sgilabel->partitions), 0, sizeof(struct sgi_partition)*16); sgi_label = 1; partitions = 16; volumes = 15; sgi_set_entire(); sgi_set_volhdr(); for (i = 0; i < 4; i++) { if (old[i].sysid) { sgi_set_partition(i, old[i].start, old[i].nsect, old[i].sysid); } }}voidsgi_set_ilfact(void){ /* do nothing in the beginning */}voidsgi_set_rspeed(void){ /* do nothing in the beginning */}voidsgi_set_pcylcount(void){ /* do nothing in the beginning */}voidsgi_set_xcyl(void){ /* do nothing in the beginning */}voidsgi_set_ncyl(void){ /* do nothing in the beginning */}/* _____________________________________________________________ */sgiinfo *fill_sgiinfo(void){ sgiinfo*info=calloc(1, sizeof(sgiinfo)); info->magic=SSWAP32(SGI_INFO_MAGIC); info->b1=SSWAP32(-1); info->b2=SSWAP16(-1); info->b3=SSWAP16(1); /* You may want to replace this string !!!!!!! */ strcpy(info->scsi_string, "IBM OEM 0662S12 3 30"); strcpy(info->serial, "0000"); info->check1816 = SSWAP16(18*256 +16); strcpy(info->installer, "Sfx version 5.3, Oct 18, 1994"); return info;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -