emul64ioctl.c revision b1dd958f54f8bfa984d306bb8ca8264855761d7b
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * CDDL HEADER START
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * The contents of this file are subject to the terms of the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Common Development and Distribution License, Version 1.0 only
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * (the "License"). You may not use this file except in compliance
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * with the License.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * or http://www.opensolaris.org/os/licensing.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * See the License for the specific language governing permissions
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * and limitations under the License.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * When distributing Covered Code, include this CDDL HEADER in each
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * If applicable, add the following below this CDDL HEADER, with the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * fields enclosed by brackets "[]" replaced with your own identifying
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * information: Portions Copyright [yyyy] [name of copyright owner]
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * CDDL HEADER END
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Use is subject to license terms.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#pragma ident "%Z%%M% %I% %E% SMI"
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala/*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * This program provides a command line interface to the
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * three new ioctls for the emul64 driver - EMUL64_WRITE_OFF,
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * EMUL64_WRITE_ON and EMUL64_ZERO_RANGE. All three of these
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * ioctls require the range of blocks to be specified. The
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * range is specified by starting block number and block count
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * both of which are 64 bit.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Returns 0 on success, >0 on failure.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala *
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <stdio.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <fcntl.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <unistd.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <stropts.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <string.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <stdlib.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <errno.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <sys/types.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#include <sys/emul64.h>
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#define DEBUG 1
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#define ADMIN_DIR "/dev/cfg/"
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalachar *Pname;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int get_disk_addr(char *path, emul64_tgt_range_t *tr, char **admin);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic void
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalausage(void)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) fprintf(stderr, "Usage: emul64ioctl -s start_block "
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala "-b block_count -c write_off | write_on | zero emul64_dev\n");
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala exit(1);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaint
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalamain(int argc, char **argv)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala extern char *optarg;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala extern int optind;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char *admin;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int count_seen = 0;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int fd, retval;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int cmd = -1;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int do_usage = 0;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala char *slice;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int sb_seen = 0;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala emul64_tgt_range_t tr;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala Pname = strrchr(argv[0], '/');
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (Pname == NULL)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala Pname = argv[0];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala else
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala Pname++;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala while ((retval = getopt(argc, argv, "s:b:c:")) != -1) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala switch (retval) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala case 's':
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala sb_seen = 1;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala tr.emul64_blkrange.emul64_sb = atoll(optarg);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala break;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala case 'b':
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala count_seen = 1;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala tr.emul64_blkrange.emul64_blkcnt = atoll(optarg);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala break;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala case 'c':
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (strncmp(optarg, "write_off",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala strlen("write_off")) == 0) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala cmd = EMUL64_WRITE_OFF;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala } else if (strncmp(optarg, "write_on",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala strlen("write_on")) == 0) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala cmd = EMUL64_WRITE_ON;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala } else if (strncmp(optarg, "zero",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala strlen("zero")) == 0) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala cmd = EMUL64_ZERO_RANGE;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala } else {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala do_usage = 1;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala break;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala default:
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala break;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (do_usage || (optind != argc - 1)) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala usage();
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((sb_seen == 0) || (count_seen == 0) || (cmd == -1))
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala usage();
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala slice = argv[optind];
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * Get admin device, target and lun
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (get_disk_addr(slice, &tr, &admin) != 0)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala exit(1);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala /*
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala * open the specified emul64_dev.
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala */
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if ((fd = open(admin, O_RDONLY, 0444)) != -1) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala retval = ioctl(fd, cmd, &tr);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) close(fd);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala if (retval != -1) {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala free(admin);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (0);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) printf("emul64ioctl: %s: ioctl %s\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala admin, strerror(errno));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala } else {
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala (void) printf("emul64ioctl: %s: open %s\n",
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala admin, strerror(errno));
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala free(admin);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala return (1);
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala}
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala#define TOK_CHECK(s) if (token == NULL) {\
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala bogus = (s);\
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala goto err_out;\
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala }
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalastatic int
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummalaget_disk_addr(char *path, emul64_tgt_range_t *tr, char **admin)
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala{
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala size_t admin_size;
1cfa752f4e24c34133009b0f6c139127a5c461deRamaswamy Tummala int ctlr_num;
int conversions;
char *ctds;
*admin = NULL;
ctds = strrchr(path, '/');
if (ctds == NULL)
ctds = path;
else
ctds++;
conversions = sscanf(ctds, "c%dt%hud%hu", &ctlr_num,
&tr->emul64_target, &tr->emul64_lun);
if (conversions != 3) {
(void) fprintf(stderr, "%s: \"%s\" is invalid disk name. "
"%d conversions\n", Pname, ctds, conversions);
return (-1);
}
/* Build controller name */
admin_size = strlen(ADMIN_DIR) +
10 + /* enough digits for an int */
1 + /* c */
1; /* Null terminator */
*admin = malloc(admin_size);
if (*admin == NULL) {
(void) fprintf(stderr, "%s: out of memory\n", Pname);
return (-1);
}
(void) snprintf(*admin, admin_size, "%sc%d", ADMIN_DIR, ctlr_num);
return (0);
}