#include "global.h"
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/wait.h>
#include <signal.h>
#include <string.h>
#include <sys/fcntl.h>
#include <sys/stat.h>
#include <sys/dklabel.h>
#include <errno.h>
#include "main.h"
#include "analyze.h"
#include "menu.h"
#include "menu_command.h"
#include "menu_defect.h"
#include "menu_partition.h"
#if defined(_FIRMWARE_NEEDS_FDISK)
#include "menu_fdisk.h"
#endif
#include "param.h"
#include "misc.h"
#include "label.h"
#include "startup.h"
#include "partition.h"
#include "prompts.h"
#include "checkdev.h"
#include "io.h"
#include "ctlr_scsi.h"
#include "auto_sense.h"
static int generic_ck_format(void);
static int generic_rdwr(int dir, int fd, diskaddr_t blkno, int secnt,
caddr_t bufaddr, int flags, int *xfercntp);
struct ctlr_ops genericops = {
generic_rdwr,
generic_ck_format,
0,
0,
0,
0,
0,
};
static int
generic_ck_format(void)
{
int status;
status = generic_rdwr(DIR_READ, cur_file, 0, 4, (caddr_t)cur_buf,
F_SILENT, NULL);
return (!status);
}
static int
generic_rdwr(int dir, int fd, diskaddr_t blkno, int secnt, caddr_t bufaddr,
int flags, int *xfercntp)
{
offset_t tmpsec, status, tmpblk;
int ret;
tmpsec = (offset_t)secnt * cur_blksz;
tmpblk = (offset_t)blkno * cur_blksz;
#if defined(_FIRMWARE_NEEDS_FDISK)
(void) open_cur_file(FD_USE_P0_PATH);
#endif
if (dir == DIR_READ) {
status = llseek(fd, tmpblk, SEEK_SET);
if (status != tmpblk) {
ret = (int)status;
goto out;
}
status = read(fd, bufaddr, (size_t)tmpsec);
if (status != tmpsec)
ret = (int)tmpsec;
else
ret = 0;
} else {
status = llseek(fd, tmpblk, SEEK_SET);
if (status != tmpblk) {
ret = (int)status;
goto out;
}
status = write(fd, bufaddr, (size_t)tmpsec);
if (status != tmpsec)
ret = (int)tmpsec;
else
ret = 0;
}
out:
#if defined(_FIRMWARE_NEEDS_FDISK)
(void) open_cur_file(FD_USE_CUR_DISK_PATH);
#endif
return (ret);
}