/* * Open file descriptor for current disk (cur_file) * with "p0" path or cur_disk->disk_path */ void open_cur_file(int mode) { char *dkpath; char pbuf[MAXPATHLEN]; switch (mode) { case FD_USE_P0_PATH: (void) get_pname(&pbuf[0]); dkpath = pbuf; break; case FD_USE_CUR_DISK_PATH: if (cur_disk->fdisk_part.systid == SUNIXOS || cur_disk->fdisk_part.systid == SUNIXOS2) { (void) get_sname(&pbuf[0]); dkpath = pbuf; } else { dkpath = cur_disk->disk_path; } break; default: err_print("Error: Invalid mode option for opening cur_file\n"); fullabort(); } /* Close previous cur_file */ (void) close(cur_file); /* Open cur_file with the required path dkpath */ if ((cur_file = open_disk(dkpath, O_RDWR | O_NDELAY)) < 0) { err_print( "Error: can't open selected disk '%s'.\n", dkpath); fullabort(); } }
static int ata_convert_list(struct defect_list *list, int list_format) { int i; struct defect_entry *new_defect; switch (list_format) { case BFI_FORMAT: if (ap->ap_tblp->alts_ent_used) { new_defect = calloc(ap->ap_tblp->alts_ent_used, sizeof (struct defect_entry)); if (new_defect == NULL) { err_print( "ata_convert_list: calloc failed\n"); fullabort(); } list->header.count = ap->ap_tblp->alts_ent_used; list->header.magicno = (uint_t)DEFECT_MAGIC; list->list = new_defect; for (i = 0; i < ap->ap_tblp->alts_ent_used; i++, new_defect++) { new_defect->cyl = bn2c((ap->ap_entp)[i].bad_start); new_defect->head = bn2h((ap->ap_entp)[i].bad_start); new_defect->bfi = UNKNOWN; new_defect->sect = bn2s((ap->ap_entp)[i].bad_start); new_defect->nbits = UNKNOWN; } } else { list->header.count = 0; list->header.magicno = (uint_t)DEFECT_MAGIC; new_defect = calloc(1, sizeof (struct defect_entry)); if (new_defect == NULL) { err_print( "ata_convert_list: calloc failed\n"); fullabort(); } list->list = new_defect; } break; default: err_print("ata_convert_list: can't deal with it\n"); exit(0); } (void) checkdefsum(list, CK_MAKESUM); return (0); }
/* * This routine deletes a partition map from the list of maps for * the given disk type. */ void delete_partition(struct partition_info *parts) { struct partition_info *pptr; /* * If there isn't a current map, it's an error. */ if (cur_dtype->dtype_plist == NULL) { err_print("Error: unexpected null partition list.\n"); fullabort(); } /* * Remove the map from the list. */ if (cur_dtype->dtype_plist == parts) cur_dtype->dtype_plist = parts->pinfo_next; else { for (pptr = cur_dtype->dtype_plist; pptr->pinfo_next != parts; pptr = pptr->pinfo_next) ; pptr->pinfo_next = parts->pinfo_next; } /* * Free the space it was using. */ destroy_data((char *)parts); }
/* * This routine implements the 'print' command. It displays the data * buffer in hexadecimal. It is only useful for checking the disk for * a specific set of data (by reading it then printing it). */ int a_print() { int i, j, lines, nomore = 0; int c, one_line = 0; int tty_lines = get_tty_lines(); /* * If we are running out of command file, don't page the output. * Otherwise we are running with a user. Turn off echoing of * input characters so we can page the output. */ if (option_f || (!isatty(0)) || (!isatty(1))) nomore++; else { enter_critical(); echo_off(); charmode_on(); exit_critical(); } /* * Loop through the data buffer. */ lines = 0; for (i = 0; i < scan_size * SECSIZE / sizeof (int); i += 6) { /* * Print the data. */ for (j = 0; j < 6; j++) if (i + j < scan_size * SECSIZE / sizeof (int)) fmt_print("0x%08x ", *((int *)((int *)cur_buf + i + j))); fmt_print("\n"); lines++; /* * If we are paging and hit the end of a page, wait for * the user to hit either space-bar, "q", return, * or ctrl-C before going on. */ if (one_line || (!nomore && (lines % (tty_lines - 1) == 0))) { /* * Print until first screenfull */ if (lines < (tty_lines -1)) continue; /* * Get the next character. */ (void) printf("- hit space for more - "); c = getchar(); (void) printf("\015"); one_line = 0; /* * Handle display one line command (return key) */ if (c == '\012') { one_line++; } /* Handle Quit command */ if (c == 'q') { (void) printf( " \015"); goto PRINT_EXIT; } /* handle ^D */ if (c == '\004') fullabort(); } } /* * If we were doing paging, turn echoing back on. */ PRINT_EXIT: if (!nomore) { enter_critical(); charmode_off(); echo_on(); exit_critical(); } return (0); }