/* * This routine implements the 'fdisk' command. It simply runs * the fdisk command on the current disk. * Use of this is restricted to interactive mode only. */ int c_fdisk() { char buf[MAXPATHLEN]; char pbuf[MAXPATHLEN]; struct stat statbuf; /* * We must be in interactive mode to use the fdisk command */ if (option_f != (char *)NULL || isatty(0) != 1 || isatty(1) != 1) { err_print("Fdisk command is for interactive use only!\n"); return (-1); } /* * There must be a current disk type and a current disk */ if (cur_dtype == NULL) { err_print("Current Disk Type is not set.\n"); return (-1); } /* * If disk is larger than 1TB then an EFI label is required * and there is no point in running fdisk */ if (cur_dtype->capacity > INFINITY) { err_print("This disk must use an EFI label.\n"); return (-1); } /* * Before running the fdisk command, get file status of * /dev/rdsk/cn[tn]dnp0 path to see if this disk * supports fixed disk partition table. */ (void) get_pname(&pbuf[0]); if (stat(pbuf, (struct stat *)&statbuf) == -1 || !S_ISCHR(statbuf.st_mode)) { err_print( "Disk does not support fixed disk partition table\n"); return (0); } /* * Run the fdisk program. */ (void) snprintf(buf, sizeof (buf), "fdisk %s\n", pbuf); (void) system(buf); /* * Open cur_file with "p0" path for accessing the fdisk table */ (void) open_cur_file(FD_USE_P0_PATH); /* * Get solaris partition information in the fdisk partition table */ if (get_solaris_part(cur_file, &cur_disk->fdisk_part) == -1) { err_print("No fdisk solaris partition found\n"); cur_disk->fdisk_part.numsect = 0; /* No Solaris */ } /* * Restore cur_file with cur_disk->disk_path */ (void) open_cur_file(FD_USE_CUR_DISK_PATH); return (0); }
/*ARGSUSED6*/ #if defined(i386) int ata_rdwr(int dir, int fd, diskaddr_t blk64, int secnt, caddr_t bufaddr, int flags, int *xfercntp) #else /* defined(i386) */ static int ata_rdwr(int dir, int fd, diskaddr_t blk64, int secnt, caddr_t bufaddr, int flags, int *xfercntp) #endif /* defined(i386) */ { int tmpsec; struct dadkio_rwcmd dadkio_rwcmd; blkaddr_t blkno; blkno = (blkaddr_t)blk64; bzero((caddr_t)&dadkio_rwcmd, sizeof (struct dadkio_rwcmd)); tmpsec = secnt * cur_blksz; /* Doing raw read */ dadkio_rwcmd.cmd = (dir == DIR_READ) ? DADKIO_RWCMD_READ : DADKIO_RWCMD_WRITE; dadkio_rwcmd.blkaddr = blkno; dadkio_rwcmd.buflen = tmpsec; dadkio_rwcmd.flags = flags; dadkio_rwcmd.bufaddr = bufaddr; media_error = 0; if (cur_ctype->ctype_ctype == DKC_PCMCIA_ATA) { /* * PCATA requires to use "p0" when calling * DIOCTL_RWCMD ioctl() to read/write the label */ (void) close(fd); (void) open_cur_file(FD_USE_P0_PATH); fd = cur_file; } if (ioctl(fd, DIOCTL_RWCMD, &dadkio_rwcmd) == -1) { err_print("DIOCTL_RWCMD: %s\n", strerror(errno)); return (1); } if (cur_ctype->ctype_ctype == DKC_PCMCIA_ATA) { /* Restore cur_file with cur_disk->disk_path */ (void) open_cur_file(FD_USE_CUR_DISK_PATH); } switch (dadkio_rwcmd.status.status) { case DADKIO_STAT_NOT_READY: disk_error = DISK_STAT_NOTREADY; break; case DADKIO_STAT_RESERVED: disk_error = DISK_STAT_RESERVED; break; case DADKIO_STAT_WRITE_PROTECTED: disk_error = DISK_STAT_DATA_PROTECT; break; case DADKIO_STAT_MEDIUM_ERROR: media_error = 1; break; } if (dadkio_rwcmd.status.status) { if ((flags & F_SILENT) == 0) err_print(dadkrawioerrs[dadkio_rwcmd.status.status], dadkio_rwcmd.status.failed_blk); return (1); } return (0); }