3 * dumpscan - routines for scanning and manipulating AFS volume dumps
5 * Copyright (c) 1998 Carnegie Mellon University
8 * Permission to use, copy, modify and distribute this software and its
9 * documentation is hereby granted, provided that both the copyright
10 * notice and this permission notice appear in all copies of the
11 * software, derivative works or modified versions, and any portions
12 * thereof, and that both notices appear in supporting documentation.
14 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
15 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
16 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
18 * Carnegie Mellon requests users of this software to return to
20 * Software Distribution Coordinator or Software_Distribution@CS.CMU.EDU
21 * School of Computer Science
22 * Carnegie Mellon University
23 * Pittsburgh PA 15213-3890
25 * any improvements or extensions that they make and grant Carnegie Mellon
26 * the rights to redistribute these changes.
29 /* xf_rxcall.c - XFILE routines for Rx bulk data transfers */
31 #include <sys/types.h>
32 #include <netinet/in.h>
44 #include <rx/rx_null.h>
47 #include <afs/cellconfig.h>
48 #include <afs/vlserver.h>
49 #include <afs/volser.h>
50 #include <afs/volint.h>
52 #ifndef AFSCONF_CLIENTNAME
53 #include <afs/dirpath.h>
54 #define AFSCONF_CLIENTNAME AFSDIR_CLIENT_ETC_DIRPATH
57 #define O_MODE_MASK (O_RDONLY | O_WRONLY | O_RDWR)
60 struct rx_connection *conn; /* connection */
61 struct rx_call *call; /* call */
62 afs_int32 tid; /* volser transaction ID */
63 afs_uint32 code; /* result code */
67 xf_rxcall_do_read(XFILE * X, void *buf, afs_uint32 count)
69 struct rxinfo *i = X->refcon;
72 xcount = rx_Read(i->call, buf, count);
75 i->code = rx_EndCall(i->call, 0);
77 return i->code ? i->code : ERROR_XFILE_RDONLY;
82 xf_rxcall_do_write(XFILE * X, void *buf, afs_uint32 count)
84 struct rxinfo *i = X->refcon;
87 xcount = rx_Write(i->call, buf, count);
90 i->code = rx_EndCall(i->call, 0);
97 xf_rxcall_do_close(XFILE * X)
99 struct rxinfo *i = X->refcon;
103 code = rx_EndCall(i->call, i->code);
114 xf_voldump_do_close(XFILE * X)
116 struct rxinfo *i = X->refcon;
117 struct rx_connection *conn = i->conn;
118 afs_int32 code, rcode, xcode;
119 afs_int32 tid = i->tid;
121 code = xf_rxcall_do_close(X);
122 xcode = AFSVolEndTrans(conn, tid, &rcode);
124 code = xcode ? xcode : rcode;
130 xfopen_rxcall(XFILE * X, int flag, struct rx_call * call)
135 if (flag == O_WRONLY)
136 return ERROR_XFILE_WRONLY;
137 memset(X, 0, sizeof(*X));
138 if (!(i = (struct rxinfo *)malloc(sizeof(struct rxinfo))))
142 X->do_read = xf_rxcall_do_read;
143 X->do_write = xf_rxcall_do_write;
144 X->do_close = xf_rxcall_do_close;
145 X->is_writable = (flag == O_RDWR);
152 xfopen_voldump(XFILE * X, struct rx_connection * conn, afs_int32 part,
153 afs_int32 volid, afs_int32 date)
155 struct rx_call *call;
157 afs_int32 code, rcode;
160 if ((code = AFSVolTransCreate(conn, volid, part, ITBusy, &tid)))
162 call = rx_NewCall(conn);
163 if ((code = StartAFSVolDump(call, tid, date))
164 || (code = xfopen_rxcall(X, O_RDONLY, call))) {
166 AFSVolEndTrans(conn, tid, &rcode);
173 X->do_close = xf_voldump_do_close;
179 xfon_voldump(XFILE * X, int flag, char *name)
182 struct rx_securityClass *class;
183 struct rx_connection *conn;
184 struct ktc_principal sname;
185 struct ktc_token token;
186 struct afsconf_dir *confdir;
187 afs_uint32 code, server_addr = 0;
188 afs_int32 volid, date, partid = 0;
192 /* Parse out the optional date and server location */
193 if ((code = rx_Init(0)))
195 if (!(name = strdup(name)))
197 if ((x = strrchr(name, ','))) {
203 if ((x = strrchr(name, '@'))) {
207 if (!(y = strchr(x, '/'))) {
209 return VL_BADPARTITION;
212 if (sscanf(x, "%d.%d.%d.%d", &a, &b, &c, &d) == 4 && a >= 0
213 && a <= 255 && b >= 0 && b <= 255 && c >= 0 && c <= 255 && d >= 0
215 server_addr = (a << 24) | (b << 16) | (c << 8) | d;
216 server_addr = htonl(server_addr);
218 he = gethostbyname(x);
223 memcpy(&server_addr, he->h_addr, sizeof(server_addr));
225 partid = volutil_GetPartitionID(y);
228 return VL_BADPARTITION;
232 /* Get tokens and set up a security object */
233 confdir = afsconf_Open(AFSCONF_CLIENTNAME);
238 if ((code = afsconf_GetLocalCell(confdir, sname.cell, MAXKTCNAMELEN))) {
242 afsconf_Close(confdir);
243 strcpy(sname.name, "afs");
244 sname.instance[0] = 0;
245 code = ktc_GetToken(&sname, &token, sizeof(token), 0);
247 class = rxnull_NewClientSecurityObject();
251 rxkad_NewClientSecurityObject(rxkad_clear, &token.sessionKey,
252 token.kvno, token.ticketLen,
257 /* Figure out the volume ID, looking it up in the VLDB if neccessary.
258 * Also look up the server and partition, if they were not specified.
260 for (isnum = 1, y = name; *y; y++)
261 if (*y < '0' || *y > '9')
266 fprintf(stderr, "XXX: need to lookup volume by ID!\n");
270 fprintf(stderr, "XXX: need to lookup volume by name!\n");
275 /* Establish a connection and start the call */
277 rx_NewConnection(server_addr, htons(AFSCONF_VOLUMEPORT),
278 VOLSERVICE_ID, class, index);
279 return xfopen_voldump(X, conn, partid, volid, date);