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/afsint.h>
50 #include <afs/volser.h>
51 #include <afs/volint.h>
53 #ifndef AFSCONF_CLIENTNAME
54 #include <afs/dirpath.h>
55 #define AFSCONF_CLIENTNAME AFSDIR_CLIENT_ETC_DIRPATH
58 #define O_MODE_MASK (O_RDONLY | O_WRONLY | O_RDWR)
61 struct rx_connection
*conn
; /* connection */
62 struct rx_call
*call
; /* call */
63 afs_int32 tid
; /* volser transaction ID */
64 afs_uint32 code
; /* result code */
68 xf_rxcall_do_read(XFILE
* X
, void *buf
, afs_uint32 count
)
70 struct rxinfo
*i
= X
->refcon
;
73 xcount
= rx_Read(i
->call
, buf
, count
);
76 i
->code
= rx_EndCall(i
->call
, 0);
78 return i
->code
? i
->code
: ERROR_XFILE_RDONLY
;
83 xf_rxcall_do_write(XFILE
* X
, void *buf
, afs_uint32 count
)
85 struct rxinfo
*i
= X
->refcon
;
88 xcount
= rx_Write(i
->call
, buf
, count
);
91 i
->code
= rx_EndCall(i
->call
, 0);
98 xf_rxcall_do_close(XFILE
* X
)
100 struct rxinfo
*i
= X
->refcon
;
104 code
= rx_EndCall(i
->call
, i
->code
);
115 xf_voldump_do_close(XFILE
* X
)
117 struct rxinfo
*i
= X
->refcon
;
118 struct rx_connection
*conn
= i
->conn
;
119 afs_int32 code
, rcode
, xcode
;
120 afs_int32 tid
= i
->tid
;
122 code
= xf_rxcall_do_close(X
);
123 xcode
= AFSVolEndTrans(conn
, tid
, &rcode
);
125 code
= xcode
? xcode
: rcode
;
131 xfopen_rxcall(XFILE
* X
, int flag
, struct rx_call
* call
)
136 if (flag
== O_WRONLY
)
137 return ERROR_XFILE_WRONLY
;
138 memset(X
, 0, sizeof(*X
));
139 if (!(i
= (struct rxinfo
*)malloc(sizeof(struct rxinfo
))))
143 X
->do_read
= xf_rxcall_do_read
;
144 X
->do_write
= xf_rxcall_do_write
;
145 X
->do_close
= xf_rxcall_do_close
;
146 X
->is_writable
= (flag
== O_RDWR
);
153 xfopen_voldump(XFILE
* X
, struct rx_connection
* conn
, afs_int32 part
,
154 afs_int32 volid
, afs_int32 date
)
156 struct rx_call
*call
;
158 afs_int32 code
, rcode
;
161 if ((code
= AFSVolTransCreate(conn
, volid
, part
, ITBusy
, &tid
)))
163 call
= rx_NewCall(conn
);
164 if ((code
= StartAFSVolDump(call
, tid
, date
))
165 || (code
= xfopen_rxcall(X
, O_RDONLY
, call
))) {
167 AFSVolEndTrans(conn
, tid
, &rcode
);
174 X
->do_close
= xf_voldump_do_close
;
180 xfon_voldump(XFILE
* X
, int flag
, char *name
)
183 struct rx_securityClass
*class;
184 struct rx_connection
*conn
;
185 struct ktc_principal sname
;
186 struct ktc_token token
;
187 struct afsconf_dir
*confdir
;
188 afs_uint32 code
, server_addr
= 0;
189 afs_int32 volid
, date
, partid
= 0;
193 /* Parse out the optional date and server location */
194 if ((code
= rx_Init(0)))
196 if (!(name
= strdup(name
)))
198 if ((x
= strrchr(name
, ','))) {
204 if ((x
= strrchr(name
, '@'))) {
208 if (!(y
= strchr(x
, '/'))) {
210 return VL_BADPARTITION
;
213 if (sscanf(x
, "%d.%d.%d.%d", &a
, &b
, &c
, &d
) == 4 && a
>= 0
214 && a
<= 255 && b
>= 0 && b
<= 255 && c
>= 0 && c
<= 255 && d
>= 0
216 server_addr
= (a
<< 24) | (b
<< 16) | (c
<< 8) | d
;
217 server_addr
= htonl(server_addr
);
219 he
= gethostbyname(x
);
224 memcpy(&server_addr
, he
->h_addr
, sizeof(server_addr
));
226 partid
= volutil_GetPartitionID(y
);
229 return VL_BADPARTITION
;
233 /* Get tokens and set up a security object */
234 confdir
= afsconf_Open(AFSCONF_CLIENTNAME
);
239 if ((code
= afsconf_GetLocalCell(confdir
, sname
.cell
, MAXKTCNAMELEN
))) {
243 afsconf_Close(confdir
);
244 strcpy(sname
.name
, "afs");
245 sname
.instance
[0] = 0;
246 code
= ktc_GetToken(&sname
, &token
, sizeof(token
), 0);
248 class = rxnull_NewClientSecurityObject();
252 rxkad_NewClientSecurityObject(rxkad_clear
, &token
.sessionKey
,
253 token
.kvno
, token
.ticketLen
,
258 /* Figure out the volume ID, looking it up in the VLDB if neccessary.
259 * Also look up the server and partition, if they were not specified.
261 for (isnum
= 1, y
= name
; *y
; y
++)
262 if (*y
< '0' || *y
> '9')
267 fprintf(stderr
, "XXX: need to lookup volume by ID!\n");
271 fprintf(stderr
, "XXX: need to lookup volume by name!\n");
276 /* Establish a connection and start the call */
278 rx_NewConnection(server_addr
, htons(AFSCONF_VOLUMEPORT
),
279 VOLSERVICE_ID
, class, index
);
280 return xfopen_voldump(X
, conn
, partid
, volid
, date
);