2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
10 #include <sys/types.h>
14 #include <sys/statfs.h>
17 #include <sys/errno.h>
19 #include <netinet/in.h>
22 #include <rx/rx_globals.h>
24 #include <afs/vlserver.h>
25 #include <afs/cellconfig.h>
28 #include <afs/afsint.h>
31 #include <afs/tcdata.h>
36 #define SERVERNAME "server1"
39 struct tc_tapeSet ttapeSet;
40 char tdumpSetName[TC_MAXNAMELEN];
41 tc_dumpArray tdumps; /*defined by rxgen */
42 tc_restoreArray trestores; /*defined by rxgen */
44 struct tc_dumpStat tstatus;
47 struct rx_connection *
48 UV_Bind(aserver, port)
49 afs_int32 aserver, port;
51 register struct rx_connection *tc;
52 struct rx_securityClass *uvclass;
54 uvclass = rxnull_NewClientSecurityObject();
55 tc = rx_NewConnection(aserver, htons(port), TCSERVICE_ID, uvclass, 0);
60 /* return host address in network byte order */
65 register struct hostent *th;
68 register afs_int32 code;
70 code = sscanf(aname, "%d.%d.%d.%d", &b1, &b2, &b3, &b4);
72 addr = (b1 << 24) | (b2 << 16) | (b3 << 8) | b4;
73 return htonl(addr); /* convert to network order (128 in byte 0) */
75 th = gethostbyname(aname);
78 memcpy(&addr, th->h_addr, sizeof(addr));
84 PerformDump(register struct cmd_syndesc *as, void *arock)
86 struct rx_connection *aconn;
89 struct tc_dumpDesc *ptr;
91 afs_int32 parentDumpID, dumpLevel;
93 server = GetServer(SERVERNAME);
95 printf("cant get server id \n");
100 strcpy(tdumpSetName, "Test");
102 ttapeSet.maxTapes = 10;
103 fp = fopen("dumpScr", "r");
104 fscanf(fp, "%u %u %u\n", &tdumps.tc_dumpArray_len, &ttapeSet.a,
106 strcpy(ttapeSet.format, "tapeName%u");
107 strcpy(ttapeSet.tapeServer, "diskTapes");
108 tdumps.tc_dumpArray_val =
110 *)(malloc(tdumps.tc_dumpArray_len * sizeof(struct tc_dumpDesc)));
111 ptr = tdumps.tc_dumpArray_val;
112 for (i = 0; i < tdumps.tc_dumpArray_len; i++) {
113 fscanf(fp, "%s\n", ptr->name);
114 fscanf(fp, "%s\n", ptr->hostAddr);
115 fscanf(fp, "%u %u %u\n", &ptr->vid, &ptr->partition, &ptr->date);
119 aconn = UV_Bind(server, TCPORT);
121 TC_PerformDump(aconn, tdumpSetName, &ttapeSet, &tdumps, parentDumpID,
122 dumpLevel, &tdumpID);
123 free(tdumps.tc_dumpArray_val);
125 printf("call to TC_PerformDump failed %u\n", code);
128 printf("dumpid returned %u\n", tdumpID);
134 PerformRestore(register struct cmd_syndesc *as, void *arock)
136 struct rx_connection *aconn;
140 struct tc_restoreDesc *ptr;
142 server = GetServer(SERVERNAME);
144 printf("cant get server id \n");
147 aconn = UV_Bind(server, TCPORT);
148 strcpy(tdumpSetName, "");
149 strcpy(tdumpSetName, "Test");
150 fp = fopen("restoreScr", "r");
151 fscanf(fp, "%u\n", &trestores.tc_restoreArray_len);
152 trestores.tc_restoreArray_val =
153 (struct tc_restoreDesc *)malloc(trestores.tc_restoreArray_len *
154 sizeof(struct tc_restoreDesc));
155 ptr = trestores.tc_restoreArray_val;
156 for (i = 0; i < trestores.tc_restoreArray_len; i++) {
157 fscanf(fp, "%s\n", ptr->oldName);
158 fscanf(fp, "%s\n", ptr->newName);
159 fscanf(fp, "%s\n", ptr->tapeName);
160 fscanf(fp, "%s\n", ptr->hostAddr);
161 fscanf(fp, "%u %u %u %u %d %u\n", &ptr->origVid, &ptr->vid,
162 &ptr->partition, &ptr->flags, &ptr->frag, &ptr->position);
166 code = TC_PerformRestore(aconn, tdumpSetName, &trestores, &tdumpID);
168 printf("call to TC_PerformRestore failed %u\n", code);
171 printf("dumpid returned %u\n", tdumpID);
176 CheckDump(register struct cmd_syndesc *as, void *arock)
178 struct rx_connection *aconn;
180 server = GetServer(SERVERNAME);
182 printf("cant get server id \n");
185 tdumpID = atol(as->parms[0].items->data);
186 aconn = UV_Bind(server, TCPORT);
187 code = TC_CheckDump(aconn, tdumpID, &tstatus);
189 printf("call to TC_CheckDump failed %u\n", code);
196 AbortDump(register struct cmd_syndesc *as, void *arock)
198 struct rx_connection *aconn;
200 server = GetServer(SERVERNAME);
202 printf("cant get server id \n");
205 tdumpID = atol(as->parms[0].items->data);
206 aconn = UV_Bind(server, TCPORT);
207 code = TC_AbortDump(aconn, tdumpID);
209 printf("call to TC_AbortDump failed %u\n", code);
216 WaitForDump(register struct cmd_syndesc *as, void *arock)
218 struct rx_connection *aconn;
220 server = GetServer(SERVERNAME);
222 printf("cant get server id \n");
225 tdumpID = atol(as->parms[0].items->data);
226 aconn = UV_Bind(server, TCPORT);
227 code = TC_WaitForDump(aconn, tdumpID);
229 printf("call to TC_WaitForDump failed %u\n", code);
236 EndDump(register struct cmd_syndesc *as, void *arock)
238 struct rx_connection *aconn;
240 server = GetServer(SERVERNAME);
242 printf("cant get server id \n");
245 tdumpID = atol(as->parms[0].items->data);
246 aconn = UV_Bind(server, TCPORT);
247 code = TC_EndDump(aconn, tdumpID);
249 printf("call to TC_EndDump failed %u\n", code);
256 MyBeforeProc(struct cmd_syndesc *as, void *arock)
262 printf("Could not initialize rx.\n");
266 rx_SetRxDeadTime(50);
270 #include "AFS_component_version_number.c"
276 register afs_int32 code;
278 register struct cmd_syndesc *ts;
282 * The following signal action for AIX is necessary so that in case of a
283 * crash (i.e. core is generated) we can include the user's data section
284 * in the core dump. Unfortunately, by default, only a partial core is
285 * generated which, in many cases, isn't too useful.
287 struct sigaction nsa;
289 sigemptyset(&nsa.sa_mask);
290 nsa.sa_handler = SIG_DFL;
291 nsa.sa_flags = SA_FULLDUMP;
292 sigaction(SIGABRT, &nsa, NULL);
293 sigaction(SIGSEGV, &nsa, NULL);
295 cmd_SetBeforeProc(MyBeforeProc, NULL);
297 ts = cmd_CreateSyntax("dump", PerformDump, NULL, "perform a dump");
299 ts = cmd_CreateSyntax("restore", PerformRestore, NULL, "perform a restore");
301 ts = cmd_CreateSyntax("check", CheckDump, NULL, "check a dump");
302 cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "dump id");
304 ts = cmd_CreateSyntax("abort", AbortDump, NULL, "abort a dump");
305 cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "dump id");
307 ts = cmd_CreateSyntax("wait", WaitForDump, NULL, "wait for a dump");
308 cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "dump id");
310 ts = cmd_CreateSyntax("end", EndDump, NULL, "end a dump");
311 cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "dump id");
313 code = cmd_Dispatch(argc, argv);