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 <afs/param.h>
11 #include <afsconfig.h>
16 #include <afs/afsint.h>
17 #include <rx/rx_globals.h>
19 #include <sys/socket.h>
20 #include <netinet/in.h>
25 struct ubik_client *cstruct;
26 struct rx_connection *serverconns[MAXSERVERS];
29 extern int AFS_FetchData(), AFS_StoreData(), AFS_StoreACL();
30 extern int RXAFS_GetTime(), AFS_GetStatistics(), AFS_FetchStatus(), AFS_FetchACL();
31 extern int AFS_StoreStatus(), AFS_RemoveFile(), AFS_CreateFile();
32 extern int AFS_Rename(), AFS_Symlink(), AFS_HardLink(), AFS_MakeDir(), AFS_RemoveDir();
33 extern int AFS_Readdir(), AFS_MakeMountPoint(), AFS_ReleaseTokens(), AFS_GetToken();
34 extern int AFS_BulkStatus(), AFS_Lookup();
35 extern int AFS_BulkStatus(), AFS_BulkLookup(), AFS_RenewAllTokens();
36 extern int AFS_BulkFetchVV(), AFS_BulkKeepAlive();
37 extern int AFS_Spare1(), AFS_Spare2(), AFS_Spare3(), AFS_Spare4(), AFS_Spare5(), AFS_Spare6();
39 afs_int32 pxclient_Initialize(auth, serverAddr)
44 struct rx_securityClass *sc;
46 code = rx_Init(htons(2115)/*0*/);
48 fprintf(stderr,"pxclient_Initialize: Could not initialize rx.\n");
55 sc = (struct rx_securityClass *) rxnull_NewClientSecurityObject();
58 #ifdef notdef /* security */
60 sc = (struct rx_securityClass *) rxvab_NewClientSecurityObject(&ttoken.sessionKey, ttoken.ticket, 0);
64 sc = (struct rx_securityClass *) rxkad_NewClientSecurityObject (rxkad_clear,
65 &ttoken.sessionKey, ttoken.kvno, ttoken.ticketLen, ttoken.ticket);
68 serverconns[0] = rx_NewConnection(serverAddr, htons(7000), 1, sc, scIndex);
70 code = ubik_ClientInit(serverconns, &cstruct);
73 fprintf(stderr,"pxclient_Initialize: ubik client init failed.\n");
81 #include "AFS_component_version_number.c"
87 struct sockaddr_in host;
88 register afs_int32 code;
89 extern struct hostent *gethostbyname();
94 int noAuth = 1; /* Default is authenticated connections */
98 printf("usage: pxclient <serverHost>\n");
101 bzero((char *)&host, sizeof(struct sockaddr_in));
102 host.sin_family = AF_INET;
103 host.sin_addr.s_addr = inet_addr(av[0]);
104 if (host.sin_addr.s_addr != -1) {
105 strcpy(hnamebuf, av[0]);
108 hp = gethostbyname(av[0]);
110 host.sin_family = hp->h_addrtype;
111 bcopy(hp->h_addr, (caddr_t)&host.sin_addr, hp->h_length);
112 hostname = hp->h_name;
114 printf("unknown server host %s\n", av[0]);
118 if (code = pxclient_Initialize(noAuth, host.sin_addr.s_addr)) {
119 printf("Couldn't initialize fs library (code=%d).\n",code);
123 code = ubik_Call(RXAFS_GetTime, cstruct, 0, &tv.tv_sec, &tv.tv_usec);
125 printf("AFS_GetTime on %s sec=%d, usec=%d\n", av[0], tv.tv_sec, tv.tv_usec);
127 printf("return code is %d\n", code);
135 if (fgets(line, 499, stdin) != NULL) {
137 register char **argp = args;
138 GetArgs(line, argp, &nargs);
141 if (!strcmp(oper, "probe")) {
142 code = ubik_Call(RXAFS_GetTime, cstruct, 0, &tv.tv_sec, &tv.tv_usec);
143 printf("return code is %d\n", code);
145 printf("sec=%d\n", tv.tv_sec);
146 } else if (!strcmp(oper, "fsstats")) {
147 struct afsStatistics stats;
149 code = ubik_Call(AFS_GetStatistics, cstruct, 0, &stats);
150 printf("return code is %d\n", code);
151 } else if (!strcmp(oper, "fd")) {
152 code = FetchData(argp);
153 printf("return code is %d\n", code);
154 } else if (!strcmp(oper, "fs")) {
155 code = FetchStatus(argp);
156 printf("return code is %d\n", code);
157 } else if (!strcmp(oper, "fa")) {
158 code = FetchACL(argp);
159 printf("return code is %d\n", code);
160 } else if (!strcmp(oper, "sd")) {
161 code = StoreData(argp);
162 printf("return code is %d\n", code);
163 } else if (!strcmp(oper, "ss")) {
164 code = StoreStatus(argp);
165 printf("return code is %d\n", code);
166 } else if (!strcmp(oper, "sa")) {
167 code = StoreACL(argp);
168 printf("return code is %d\n", code);
169 } else if (!strcmp(oper, "cf")) {
170 code = CreateFile(argp);
171 printf("return code is %d\n", code);
172 } else if (!strcmp(oper, "rf")) {
173 code = RemoveFile(argp);
174 printf("return code is %d\n", code);
175 } else if (!strcmp(oper, "rn")) {
177 printf("return code is %d\n", code);
178 } else if (!strcmp(oper, "sl")) {
179 code = Symlink(argp);
180 printf("return code is %d\n", code);
181 } else if (!strcmp(oper, "hl")) {
182 code = HardLink(argp);
183 printf("return code is %d\n", code);
184 } else if (!strcmp(oper, "md")) {
185 code = MakeDir(argp);
186 printf("return code is %d\n", code);
187 } else if (!strcmp(oper, "rd")) {
188 code = RemoveDir(argp);
189 printf("return code is %d\n", code);
190 } else if (!strcmp(oper, "rdd")) {
191 code = Readdir(argp);
192 printf("return code is %d\n", code);
193 } else if (!strcmp(oper, "mm")) {
194 code = MakeMountPoint(argp);
195 printf("return code is %d\n", code);
196 } else if (!strcmp(oper, "rt")) {
197 code = ReleaseTokens(argp);
198 printf("return code is %d\n", code);
199 } else if (!strcmp(oper, "bs")) {
200 code = BulkStatus(argp);
201 printf("return code is %d\n", code);
202 } else if (!strcmp(oper, "lk")) {
204 printf("return code is %d\n", code);
205 } else if (!strcmp(oper, "gt")) {
206 code = GetToken(argp);
207 printf("return code is %d\n", code);
208 } else if (!strcmp(oper, "ka")) {
209 code = KeepAlive(argp);
210 printf("return code is %d\n", code);
211 } else if ((!strcmp(oper,"q")) || !strcmp(oper, "quit"))
214 printf("Unknown oper! Available operations: \n\n");
215 printf("fd <vnode> <unique> <pos> <len>\n");
216 printf("fs <vnode> <unique>\n");
217 printf("fa <vnode> <unique>\n");
218 printf("sd <vnode> <unique> <pos> <len> <flen> [<mode>|-1] [<owner>|-1] [<length>|-1] <string>\n");
219 printf("ss <vnode> <unique> [<mode>|-1] [<owner>|-1] [<length>|-1]\n");
220 printf("sa <vnode> <unique> <string>\n");
221 printf("rf <vnode> <unique> <name>\n");
222 printf("cf <vnode> <unique> <name> [<mode>|-1] [<owner>|-1] [<length>|-1]\n");
223 printf("rn <ovnode> <ounique> <oname> <nvnode> <nunique> <nname>\n");
224 printf("sl <vnode> <unique> <name> <contents> [<mode>|-1] [<owner>|-1] [<length>|-1]\n");
225 printf("hl <dvnode> <dunique> <name> <evnode> <eunique>\n");
226 printf("md <vnode> <unique> <name> [<mode>|-1] [<owner>|-1] [<length>|-1]\n");
227 printf("rd <vnode> <unique> <name>\n");
228 printf("rdd <vnode> <unique> <pos> <len>\n");
229 printf("lk <vnode> <unique> <name>\n");
230 printf("gt <vnode> <unique> <tokenID>\n");
231 printf("ka <vol.l> <vnode> <unique> <isExec> <kaTime>\n");
239 GetArgs(line,args, nargs)
241 register char **args;
246 register char *last = line;
253 *args++ = line, (*nargs)++;
254 while (*line && *line != ' ')
263 struct afsFetchStatus OutStatus;
264 struct afsToken Token;
265 struct afsVolSync tsync;
267 int vnode, unique, position, length;
269 struct rx_call *tcall;
271 sscanf(&(*argp)[0], "%d", &vnode);
273 sscanf(&(*argp)[0], "%d", &unique);
275 bzero(&fid, sizeof(struct afsFid));
276 fid.Volume.low = 10; /* XXX */
279 sscanf(&(*argp)[0], "%d", &position);
281 sscanf(&(*argp)[0], "%d", &length);
283 tcall = rx_NewCall(cstruct->conns[0]);
284 code = StartAFS_FetchData(tcall, &fid, &hyp0, position, length, 0);
286 code = FetchProc(tcall);
289 code = EndAFS_FetchData(tcall, &OutStatus, &Token, &tsync);
291 code = rx_EndCall(tcall, code);
295 static FetchProc(acall)
296 register struct rx_call *acall;
298 extern char *malloc();
299 register char *tbuffer;
300 afs_int32 tlen, length, code;
302 code = rx_Read(acall, &length, sizeof(afs_int32));
303 length = ntohl(length);
304 if (code != sizeof(afs_int32))
306 tbuffer = malloc(256);
308 tlen = (length > 256? 256 : length);
309 code = rx_Read(acall, tbuffer, tlen);
324 struct afsFetchStatus OutStatus;
325 struct afsToken Token;
326 struct afsVolSync tsync;
331 sscanf(&(*argp)[0], "%d", &vnode);
333 sscanf(&(*argp)[0], "%d", &unique);
335 bzero(&fid, sizeof(struct afsFid));
336 fid.Volume.low = 10; /* XXX */
339 code = ubik_Call(AFS_FetchStatus, cstruct, 0, &fid, &hyp0, 0,
340 &OutStatus, &Token, &tsync);
348 struct afsFetchStatus OutStatus;
349 struct afsACL AccessList;
350 struct afsToken Token;
351 struct afsVolSync tsync;
356 sscanf(&(*argp)[0], "%d", &vnode);
358 sscanf(&(*argp)[0], "%d", &unique);
360 bzero(&fid, sizeof(struct afsFid));
361 fid.Volume.low = 10; /* XXX */
364 code = ubik_Call(AFS_FetchACL, cstruct, 0, &fid, &hyp0, 0,
365 &AccessList, &OutStatus, &tsync);
373 struct afsStoreStatus InStatus;
374 struct afsFetchStatus OutStatus;
375 struct afsVolSync tsync;
377 int vnode, unique, position, length, filelength;
378 int mode, owner, len;
381 struct rx_call *tcall;
383 sscanf(&(*argp)[0], "%d", &vnode);
385 sscanf(&(*argp)[0], "%d", &unique);
387 bzero(&fid, sizeof(struct afsFid));
388 fid.Volume.low = 10; /* XXX */
391 sscanf(&(*argp)[0], "%d", &position);
393 sscanf(&(*argp)[0], "%d", &length);
395 sscanf(&(*argp)[0], "%d", &filelength);
397 bzero(&InStatus, sizeof(struct afsStoreStatus));
398 sscanf(&(*argp)[0], "%d", &mode);
400 sscanf(&(*argp)[0], "%d", &owner);
402 sscanf(&(*argp)[0], "%d", &len);
405 InStatus.mode = mode;
406 InStatus.mask |= AFS_SETMODE;
409 InStatus.owner = owner;
410 InStatus.mask |= AFS_SETOWNER;
413 InStatus.length = length;
414 InStatus.mask |= AFS_SETLENGTH;
416 string = &argp[0][0];
419 tcall = rx_NewCall(cstruct->conns[0]);
420 code = StartAFS_StoreData(tcall, &fid, &InStatus, position, length, filelength, &hyp0, 0);
422 code = StoreProc(tcall, string, length);
425 code = EndAFS_StoreData(tcall, &OutStatus, &tsync);
427 code = rx_EndCall(tcall, code);
432 static StoreProc(acall, string, length)
433 register struct rx_call *acall;
437 afs_int32 tlen, code;
440 tlen = (length > 256? 256 : length);
441 code = rx_Write(acall, string, tlen);
454 struct afsStoreStatus InStatus;
455 struct afsFetchStatus OutStatus;
456 struct afsVolSync tsync;
458 int vnode, unique, mode, owner, length;
461 sscanf(&(*argp)[0], "%d", &vnode);
463 sscanf(&(*argp)[0], "%d", &unique);
465 bzero(&fid, sizeof(struct afsFid));
466 fid.Volume.low = 10; /* XXX */
469 bzero(&InStatus, sizeof(struct afsStoreStatus));
470 sscanf(&(*argp)[0], "%d", &mode);
472 sscanf(&(*argp)[0], "%d", &owner);
474 sscanf(&(*argp)[0], "%d", &length);
477 InStatus.mode = mode;
478 InStatus.mask |= AFS_SETMODE;
481 InStatus.owner = owner;
482 InStatus.mask |= AFS_SETOWNER;
485 InStatus.length = length;
486 InStatus.mask |= AFS_SETLENGTH;
488 code = ubik_Call(AFS_StoreStatus, cstruct, 0, &fid, &InStatus, &hyp0, 0,
497 struct afsFetchStatus OutStatus;
498 struct afsACL AccessList;
499 struct afsToken Token;
500 struct afsVolSync tsync;
506 sscanf(&(*argp)[0], "%d", &vnode);
508 sscanf(&(*argp)[0], "%d", &unique);
510 bzero(&fid, sizeof(struct afsFid));
511 fid.Volume.low = 10; /* XXX */
514 string = &argp[0][0];
516 AccessList.afsACL_len = strlen(string)+1;
517 AccessList.afsACL_val = string;
518 code = ubik_Call(AFS_StoreACL, cstruct, 0, &fid,
519 &AccessList, &hyp0, 0, &OutStatus, &tsync);
527 struct afsFetchStatus OutDirStatus, OutFidStatus;
528 struct afsVolSync tsync;
529 struct afsFidName nameFid;
530 struct afsFid fid, outFid;
535 sscanf(&(*argp)[0], "%d", &vnode);
537 sscanf(&(*argp)[0], "%d", &unique);
539 bzero(&fid, sizeof(struct afsFid));
540 fid.Volume.low = 10; /* XXX */
545 bzero(&nameFid, sizeof(struct afsFidName));
546 strcpy(nameFid.name, name);
547 code = ubik_Call(AFS_RemoveFile, cstruct, 0, &fid, &nameFid, &hyp0, 0,
548 &OutDirStatus, &OutFidStatus, &outFid, &tsync);
556 struct afsFetchStatus OutDirStatus, OutFidStatus;
557 struct afsStoreStatus InStatus;
558 struct afsVolSync tsync;
559 struct afsFid fid, outFid;
560 struct afsToken Token;
562 int vnode, unique, mode, owner, length;
565 sscanf(&(*argp)[0], "%d", &vnode);
567 sscanf(&(*argp)[0], "%d", &unique);
569 bzero(&fid, sizeof(struct afsFid));
570 fid.Volume.low = 10; /* XXX */
575 bzero(&InStatus, sizeof(struct afsStoreStatus));
576 sscanf(&(*argp)[0], "%d", &mode);
578 sscanf(&(*argp)[0], "%d", &owner);
580 sscanf(&(*argp)[0], "%d", &length);
583 InStatus.mode = mode;
584 InStatus.mask |= AFS_SETMODE;
587 InStatus.owner = owner;
588 InStatus.mask |= AFS_SETOWNER;
591 InStatus.length = length;
592 InStatus.mask |= AFS_SETLENGTH;
594 code = ubik_Call(AFS_CreateFile, cstruct, 0, &fid, name, &InStatus, &hyp0, 0,
595 &outFid, &OutFidStatus, &OutDirStatus, &Token, &tsync);
603 struct afsFetchStatus OutOldDirStatus, OutNewDirStatus;
604 struct afsFetchStatus OutOldFileStatus, OutNewFileStatus;
605 struct afsVolSync tsync;
606 struct afsFid OldDirFid, NewDirFid, OutOldFileFid, OutNewFileFid;
607 struct afsFidName OldName, NewName;
609 int ovnode, ounique, nvnode, nunique;
612 sscanf(&(*argp)[0], "%d", &ovnode);
614 sscanf(&(*argp)[0], "%d", &ounique);
616 bzero(&OldDirFid, sizeof(struct afsFid));
617 OldDirFid.Volume.low = 10; /* XXX */
618 OldDirFid.Vnode = ovnode;
619 OldDirFid.Unique = ounique;
622 bzero(&OldName, sizeof(struct afsFidName));
623 strcpy(OldName.name, oname);
624 sscanf(&(*argp)[0], "%d", &nvnode);
626 sscanf(&(*argp)[0], "%d", &nunique);
628 bzero(&NewDirFid, sizeof(struct afsFid));
629 NewDirFid.Volume.low = 10; /* XXX */
630 NewDirFid.Vnode = nvnode;
631 NewDirFid.Unique = nunique;
634 bzero(&NewName, sizeof(struct afsFidName));
635 strcpy(NewName.name, nname);
636 code = ubik_Call(AFS_Rename, cstruct, 0, &OldDirFid, &OldName, &NewDirFid, &NewName, &hyp0, 0,
637 &OutOldDirStatus, &OutNewDirStatus,
638 &OutOldFileFid, &OutOldFileStatus,
639 &OutNewFileFid, &OutNewFileStatus, &tsync);
647 struct afsFetchStatus OutDirStatus, OutFidStatus;
648 struct afsStoreStatus InStatus;
649 struct afsVolSync tsync;
650 struct afsFid fid, outFid;
651 struct afsToken Token;
652 char *name, *linkcontents;
653 int vnode, unique, mode, owner, length;
656 sscanf(&(*argp)[0], "%d", &vnode);
658 sscanf(&(*argp)[0], "%d", &unique);
660 bzero(&fid, sizeof(struct afsFid));
661 fid.Volume.low = 10; /* XXX */
666 linkcontents = &argp[0][0];
668 bzero(&InStatus, sizeof(struct afsStoreStatus));
669 sscanf(&(*argp)[0], "%d", &mode);
671 sscanf(&(*argp)[0], "%d", &owner);
673 sscanf(&(*argp)[0], "%d", &length);
676 InStatus.mode = mode;
677 InStatus.mask |= AFS_SETMODE;
680 InStatus.owner = owner;
681 InStatus.mask |= AFS_SETOWNER;
684 InStatus.length = length;
685 InStatus.mask |= AFS_SETLENGTH;
687 code = ubik_Call(AFS_Symlink, cstruct, 0, &fid, name, linkcontents, &InStatus, &hyp0, 0,
688 &outFid, &OutFidStatus, &OutDirStatus, &Token, &tsync);
696 struct afsFetchStatus OutDirStatus, OutFidStatus;
697 struct afsVolSync tsync;
698 struct afsFid fid, existingFid;
703 sscanf(&(*argp)[0], "%d", &vnode);
705 sscanf(&(*argp)[0], "%d", &unique);
707 bzero(&fid, sizeof(struct afsFid));
708 fid.Volume.low = 10; /* XXX */
713 sscanf(&(*argp)[0], "%d", &vnode);
715 sscanf(&(*argp)[0], "%d", &unique);
717 bzero(&existingFid, sizeof(struct afsFid));
718 existingFid.Volume.low = 10; /* XXX */
719 existingFid.Vnode = vnode;
720 existingFid.Unique = unique;
721 code = ubik_Call(AFS_HardLink, cstruct, 0, &fid, name, &existingFid, &hyp0, 0,
722 &OutFidStatus, &OutDirStatus, &tsync);
730 struct afsFetchStatus OutDirStatus, OutFidStatus;
731 struct afsStoreStatus InStatus;
732 struct afsVolSync tsync;
733 struct afsFid fid, outFid;
734 struct afsToken Token;
736 int vnode, unique, mode, owner, length;
739 sscanf(&(*argp)[0], "%d", &vnode);
741 sscanf(&(*argp)[0], "%d", &unique);
743 bzero(&fid, sizeof(struct afsFid));
744 fid.Volume.low = 10; /* XXX */
749 bzero(&InStatus, sizeof(struct afsStoreStatus));
750 sscanf(&(*argp)[0], "%d", &mode);
752 sscanf(&(*argp)[0], "%d", &owner);
754 sscanf(&(*argp)[0], "%d", &length);
757 InStatus.mode = mode;
758 InStatus.mask |= AFS_SETMODE;
761 InStatus.owner = owner;
762 InStatus.mask |= AFS_SETOWNER;
765 InStatus.length = length;
766 InStatus.mask |= AFS_SETLENGTH;
768 code = ubik_Call(AFS_MakeDir, cstruct, 0, &fid, name, &InStatus, &hyp0, 0,
769 &outFid, &OutFidStatus, &OutDirStatus, &Token, &tsync);
777 struct afsFetchStatus OutDirStatus;
778 struct afsVolSync tsync;
779 struct afsFid fid, outFid;
780 struct afsFidName nameFid;
785 sscanf(&(*argp)[0], "%d", &vnode);
787 sscanf(&(*argp)[0], "%d", &unique);
789 bzero(&fid, sizeof(struct afsFid));
790 fid.Volume.low = 10; /* XXX */
795 bzero(&nameFid, sizeof(struct afsFidName));
796 strcpy(nameFid.name, name);
797 code = ubik_Call(AFS_RemoveDir, cstruct, 0, &fid, &nameFid, &hyp0, 0,
798 &OutDirStatus, &outFid, &tsync);
806 struct afsFetchStatus OutDirStatus;
807 struct afsVolSync tsync;
809 struct afsToken Token;
811 struct rx_call *tcall;
812 int vnode, unique, offset, length, NextOffset;
815 sscanf(&(*argp)[0], "%d", &vnode);
817 sscanf(&(*argp)[0], "%d", &unique);
819 sscanf(&(*argp)[0], "%d", &offset);
821 sscanf(&(*argp)[0], "%d", &length);
823 bzero(&fid, sizeof(struct afsFid));
824 fid.Volume.low = 10; /* XXX */
827 tcall = rx_NewCall(cstruct->conns[0]);
828 code = StartAFS_Readdir(tcall, &fid, offset, length, &hyp0, 0);
830 code = FetchDir(tcall);
833 code = EndAFS_FetchData(tcall, &NextOffset, &OutDirStatus, &Token, &tsync);
835 code = rx_EndCall(tcall, code);
840 static FetchDir(acall)
841 register struct rx_call *acall;
843 extern char *malloc();
844 register char *tbuffer;
845 afs_int32 tlen, length, code;
849 tbuffer = malloc(256);
851 code = rx_Read(acall, &length, sizeof(afs_int32));
852 length = ntohl(length);
853 if (code != sizeof(afs_int32))
857 tlen = (length > 8192? 8192 : length);
858 code = rx_Read(acall, tbuffer, tlen);
865 dp = (struct dirent *)dp;
874 struct afsFetchStatus OutDirStatus, OutFidStatus;
875 struct afsVolSync tsync;
876 struct afsFid fid, outFid;
881 sscanf(&(*argp)[0], "%d", &vnode);
883 sscanf(&(*argp)[0], "%d", &unique);
885 bzero(&fid, sizeof(struct afsFid));
886 fid.Volume.low = 10; /* XXX */
891 code = ubik_Call(AFS_Lookup, cstruct, 0, &fid, name, &hyp0, 0,
892 &outFid, &OutFidStatus, &OutDirStatus, &tsync);
900 struct afsFetchStatus OutStatus;
901 struct afsVolSync tsync;
902 struct afsToken MinToken, RealToken;
904 int vnode, unique, tokenId;
907 sscanf(&(*argp)[0], "%d", &vnode);
909 sscanf(&(*argp)[0], "%d", &unique);
911 bzero(&fid, sizeof(struct afsFid));
912 fid.Volume.low = 10; /* XXX */
915 sscanf(&(*argp)[0], "%d", &tokenId);
917 bzero(&MinToken, sizeof(struct afsToken));
918 MinToken.tokenID.low = tokenId; /* XXX */
919 code = ubik_Call(AFS_GetToken, cstruct, 0, &fid, &MinToken, &hyp0, 0,
920 &RealToken, &OutStatus, &tsync);
939 /* printf("ka <vol.l> <vnode> <unique> <isExec> <kaTime>\n"); */
943 struct afsBulkFEX fex;
944 afs_uint32 numExec, spare4;
948 bzero(&fx, sizeof(struct afsFidExp));
949 sscanf(&(*argp)[0], "%d", &fx.fid.Volume.low);
951 sscanf(&(*argp)[0], "%d", &fx.fid.Vnode);
953 sscanf(&(*argp)[0], "%d", &fx.fid.Unique);
955 sscanf(&(*argp)[0], "%d", &numExec);
957 sscanf(&(*argp)[0], "%d", &fx.keepAliveTime);
958 bzero(&fex, sizeof(struct afsBulkFEX));
959 fex.afsBulkFEX_val = &fx;
960 fex.afsBulkFEX_len = 1;
961 code = ubik_Call(AFS_BulkKeepAlive, cstruct, 0, &fex, numExec, 0, 0, 0, &spare4);