|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24: /*
25: * write.c.
26: */
27:
28: #import <bsd/sys/types.h>
29: #import <ansi/stdio.h>
30: #import <mach/kern_return.h>
31: #import <mach/mach.h>
32: #import <ansi/stdlib.h>
33: #import "defaults.h"
34: #import "buflib.h"
35: #import <remote/NXConnection.h>
36: #import <driverkit/IODisk.h>
37: #import <driverkit/IODiskRwDistributed.h>
38:
39: void usage(char **argv);
40: void exit(int exitcode);
41: void fill_buf(u_char *p, int size, char d);
42: void mach_error(char *c, kern_return_t e);
43:
44: int main(int argc, char **argv) {
45:
46: int arg;
47: char c;
48: id targetId;
49: IOReturn rtn;
50: IOData *wdata;
51: u_int bytes_xfr;
52: const char *outstr;
53:
54: /*
55: * user-spec'd variables
56: */
57: u_int byte_count=BYTE_COUNT_DEFAULT; /* bytes to write */
58: u_int block_num=0;
59: char *hostname=HOST_DEFAULT;
60: char *devname=DEVICE_DEFAULT;
61: char data_patt = 'z';
62:
63: /*
64: * Get standard defaults from environment or defaults.h
65: */
66: get_default("byte_count", &byte_count, BYTE_COUNT_DEFAULT);
67: get_default_t("hostname", &hostname, HOST_DEFAULT);
68: get_default_t("devname", &devname, DEVICE_DEFAULT);
69:
70: for(arg=1; arg<argc; arg++) {
71: c = argv[arg][0];
72: switch(c) {
73: case 'y':
74: byte_count = atoi(&argv[arg][2]);
75: break;
76: case 'h':
77: hostname = &argv[arg][2];
78: break;
79: case 'd':
80: devname = &argv[arg][2];
81: break;
82: case 'b':
83: block_num = atoi(&argv[arg][2]);
84: break;
85: case 'p':
86: data_patt = argv[arg][2];
87: break;
88: default:
89: usage(argv);
90: }
91: }
92: #if IOSERVER
93: rtn = [IOClient clientOpen:devname
94: hostName:hostname
95: intentions:IO_INT_WRITE
96: idp:&targetId];
97: if(rtn) {
98: [IOClient ioError:rtn
99: logString:"clientOpen"
100: outString:outstr];
101: printf(outstr);
102: exit(1);
103: }
104: #else IOSERVER
105: /*
106: * RO way...
107: */
108: targetId = [NXConnection connectToName:devname
109: onHost:hostname];
110: if(targetId == nil) {
111: printf("connectToName:%s failed\n", devname);
112: exit(1);
113: }
114: #endif IOSERVER
115: wdata = [[IOData alloc] initWithSize:byte_count];
116: [wdata setFreeFlag:YES];
117: fill_buf((u_char *)[wdata data], (int)byte_count, data_patt);
118: rtn = [targetId writeAt:block_num
119: length:byte_count
120: data:wdata
121: actualLength:&bytes_xfr];
122: if(rtn != IO_R_SUCCESS) {
123: outstr = [targetId stringFromReturn:rtn];
124: printf("write: %s\n", outstr);
125: exit(1);
126: }
127: if(bytes_xfr != byte_count) {
128: printf("bytes_xfr = %d; expected %d\n", bytes_xfr, byte_count);
129: }
130: else
131: printf("...ok\n");
132: exit(0);
133:
134: } /* main() */
135:
136: void usage(char **argv) {
137: printf("usage: %s [y=byte_count] [b=block_num] [p={z,1,i,d}] [h=hostname] [d=devname]\n", argv[0]);
138: exit(1);
139: }
140:
141: void fill_buf(u_char *buf, int size, char data_patt) {
142:
143: int i;
144:
145: for(i=0; i<size; i++) {
146: switch(data_patt) {
147: case 'z':
148: *buf++ = 0;
149: break;
150: case '1':
151: *buf++ = 0xff;
152: break;
153: case 'i':
154: *buf++ = (u_char)i;
155: break;
156: case 'd':
157: *buf++ = 0xff - (u_char)i;
158: break;
159: default:
160: printf("bogus data_patt (%c) in fill_buf()\n",
161: data_patt);
162: exit(1);
163: }
164: }
165: } /* fill_buf() */
166:
167:
168:
169:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.