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 <afsconfig.h>
11 #include <afs/param.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 memset((char *)&host, 0, sizeof(struct sockaddr_in));
102 host.sin_family = AF_INET;
103 host.sin_addr.s_addr = inet_addr(av[0]);
104 #ifdef STRUCT_SOCKADDR_HAS_SA_LEN
105 host.sin_len = sizeof(struct sockaddr_in);
107 if (host.sin_addr.s_addr != -1) {
108 strcpy(hnamebuf, av[0]);
111 hp = gethostbyname(av[0]);
113 host.sin_family = hp->h_addrtype;
114 memcpy((caddr_t)&host.sin_addr, hp->h_addr, hp->h_length);
115 hostname = hp->h_name;
117 printf("unknown server host %s\n", av[0]);
121 if (code = pxclient_Initialize(noAuth, host.sin_addr.s_addr)) {
122 printf("Couldn't initialize fs library (code=%d).\n",code);
126 code = ubik_Call(RXAFS_GetTime, cstruct, 0, &tv.tv_sec, &tv.tv_usec);
128 printf("AFS_GetTime on %s sec=%d, usec=%d\n", av[0], tv.tv_sec, tv.tv_usec);
130 printf("return code is %d\n", code);
138 if (fgets(line, 499, stdin) != NULL) {
140 register char **argp = args;
141 GetArgs(line, argp, &nargs);
144 if (!strcmp(oper, "probe")) {
145 code = ubik_Call(RXAFS_GetTime, cstruct, 0, &tv.tv_sec, &tv.tv_usec);
146 printf("return code is %d\n", code);
148 printf("sec=%d\n", tv.tv_sec);
149 } else if (!strcmp(oper, "fsstats")) {
150 struct afsStatistics stats;
152 code = ubik_Call(AFS_GetStatistics, cstruct, 0, &stats);
153 printf("return code is %d\n", code);
154 } else if (!strcmp(oper, "fd")) {
155 code = FetchData(argp);
156 printf("return code is %d\n", code);
157 } else if (!strcmp(oper, "fs")) {
158 code = FetchStatus(argp);
159 printf("return code is %d\n", code);
160 } else if (!strcmp(oper, "fa")) {
161 code = FetchACL(argp);
162 printf("return code is %d\n", code);
163 } else if (!strcmp(oper, "sd")) {
164 code = StoreData(argp);
165 printf("return code is %d\n", code);
166 } else if (!strcmp(oper, "ss")) {
167 code = StoreStatus(argp);
168 printf("return code is %d\n", code);
169 } else if (!strcmp(oper, "sa")) {
170 code = StoreACL(argp);
171 printf("return code is %d\n", code);
172 } else if (!strcmp(oper, "cf")) {
173 code = CreateFile(argp);
174 printf("return code is %d\n", code);
175 } else if (!strcmp(oper, "rf")) {
176 code = RemoveFile(argp);
177 printf("return code is %d\n", code);
178 } else if (!strcmp(oper, "rn")) {
180 printf("return code is %d\n", code);
181 } else if (!strcmp(oper, "sl")) {
182 code = Symlink(argp);
183 printf("return code is %d\n", code);
184 } else if (!strcmp(oper, "hl")) {
185 code = HardLink(argp);
186 printf("return code is %d\n", code);
187 } else if (!strcmp(oper, "md")) {
188 code = MakeDir(argp);
189 printf("return code is %d\n", code);
190 } else if (!strcmp(oper, "rd")) {
191 code = RemoveDir(argp);
192 printf("return code is %d\n", code);
193 } else if (!strcmp(oper, "rdd")) {
194 code = Readdir(argp);
195 printf("return code is %d\n", code);
196 } else if (!strcmp(oper, "mm")) {
197 code = MakeMountPoint(argp);
198 printf("return code is %d\n", code);
199 } else if (!strcmp(oper, "rt")) {
200 code = ReleaseTokens(argp);
201 printf("return code is %d\n", code);
202 } else if (!strcmp(oper, "bs")) {
203 code = BulkStatus(argp);
204 printf("return code is %d\n", code);
205 } else if (!strcmp(oper, "lk")) {
207 printf("return code is %d\n", code);
208 } else if (!strcmp(oper, "gt")) {
209 code = GetToken(argp);
210 printf("return code is %d\n", code);
211 } else if (!strcmp(oper, "ka")) {
212 code = KeepAlive(argp);
213 printf("return code is %d\n", code);
214 } else if ((!strcmp(oper,"q")) || !strcmp(oper, "quit"))
217 printf("Unknown oper! Available operations: \n\n");
218 printf("fd <vnode> <unique> <pos> <len>\n");
219 printf("fs <vnode> <unique>\n");
220 printf("fa <vnode> <unique>\n");
221 printf("sd <vnode> <unique> <pos> <len> <flen> [<mode>|-1] [<owner>|-1] [<length>|-1] <string>\n");
222 printf("ss <vnode> <unique> [<mode>|-1] [<owner>|-1] [<length>|-1]\n");
223 printf("sa <vnode> <unique> <string>\n");
224 printf("rf <vnode> <unique> <name>\n");
225 printf("cf <vnode> <unique> <name> [<mode>|-1] [<owner>|-1] [<length>|-1]\n");
226 printf("rn <ovnode> <ounique> <oname> <nvnode> <nunique> <nname>\n");
227 printf("sl <vnode> <unique> <name> <contents> [<mode>|-1] [<owner>|-1] [<length>|-1]\n");
228 printf("hl <dvnode> <dunique> <name> <evnode> <eunique>\n");
229 printf("md <vnode> <unique> <name> [<mode>|-1] [<owner>|-1] [<length>|-1]\n");
230 printf("rd <vnode> <unique> <name>\n");
231 printf("rdd <vnode> <unique> <pos> <len>\n");
232 printf("lk <vnode> <unique> <name>\n");
233 printf("gt <vnode> <unique> <tokenID>\n");
234 printf("ka <vol.l> <vnode> <unique> <isExec> <kaTime>\n");
242 GetArgs(line,args, nargs)
244 register char **args;
249 register char *last = line;
256 *args++ = line, (*nargs)++;
257 while (*line && *line != ' ')
266 struct afsFetchStatus OutStatus;
267 struct afsToken Token;
268 struct afsVolSync tsync;
270 int vnode, unique, position, length;
272 struct rx_call *tcall;
274 sscanf(&(*argp)[0], "%d", &vnode);
276 sscanf(&(*argp)[0], "%d", &unique);
278 memset(&fid, 0, sizeof(struct afsFid));
279 fid.Volume.low = 10; /* XXX */
282 sscanf(&(*argp)[0], "%d", &position);
284 sscanf(&(*argp)[0], "%d", &length);
286 tcall = rx_NewCall(cstruct->conns[0]);
287 code = StartAFS_FetchData(tcall, &fid, &hyp0, position, length, 0);
289 code = FetchProc(tcall);
292 code = EndAFS_FetchData(tcall, &OutStatus, &Token, &tsync);
294 code = rx_EndCall(tcall, code);
298 static FetchProc(acall)
299 register struct rx_call *acall;
301 extern char *malloc();
302 register char *tbuffer;
303 afs_int32 tlen, length, code;
305 code = rx_Read(acall, &length, sizeof(afs_int32));
306 length = ntohl(length);
307 if (code != sizeof(afs_int32))
309 tbuffer = malloc(256);
311 tlen = (length > 256? 256 : length);
312 code = rx_Read(acall, tbuffer, tlen);
327 struct afsFetchStatus OutStatus;
328 struct afsToken Token;
329 struct afsVolSync tsync;
334 sscanf(&(*argp)[0], "%d", &vnode);
336 sscanf(&(*argp)[0], "%d", &unique);
338 memset(&fid, 0, sizeof(struct afsFid));
339 fid.Volume.low = 10; /* XXX */
342 code = ubik_Call(AFS_FetchStatus, cstruct, 0, &fid, &hyp0, 0,
343 &OutStatus, &Token, &tsync);
351 struct afsFetchStatus OutStatus;
352 struct afsACL AccessList;
353 struct afsToken Token;
354 struct afsVolSync tsync;
359 sscanf(&(*argp)[0], "%d", &vnode);
361 sscanf(&(*argp)[0], "%d", &unique);
363 memset(&fid, 0, sizeof(struct afsFid));
364 fid.Volume.low = 10; /* XXX */
367 code = ubik_Call(AFS_FetchACL, cstruct, 0, &fid, &hyp0, 0,
368 &AccessList, &OutStatus, &tsync);
376 struct afsStoreStatus InStatus;
377 struct afsFetchStatus OutStatus;
378 struct afsVolSync tsync;
380 int vnode, unique, position, length, filelength;
381 int mode, owner, len;
384 struct rx_call *tcall;
386 sscanf(&(*argp)[0], "%d", &vnode);
388 sscanf(&(*argp)[0], "%d", &unique);
390 memset(&fid, 0, sizeof(struct afsFid));
391 fid.Volume.low = 10; /* XXX */
394 sscanf(&(*argp)[0], "%d", &position);
396 sscanf(&(*argp)[0], "%d", &length);
398 sscanf(&(*argp)[0], "%d", &filelength);
400 memset(&InStatus, 0, sizeof(struct afsStoreStatus));
401 sscanf(&(*argp)[0], "%d", &mode);
403 sscanf(&(*argp)[0], "%d", &owner);
405 sscanf(&(*argp)[0], "%d", &len);
408 InStatus.mode = mode;
409 InStatus.mask |= AFS_SETMODE;
412 InStatus.owner = owner;
413 InStatus.mask |= AFS_SETOWNER;
416 InStatus.length = length;
417 InStatus.mask |= AFS_SETLENGTH;
419 string = &argp[0][0];
422 tcall = rx_NewCall(cstruct->conns[0]);
423 code = StartAFS_StoreData(tcall, &fid, &InStatus, position, length, filelength, &hyp0, 0);
425 code = StoreProc(tcall, string, length);
428 code = EndAFS_StoreData(tcall, &OutStatus, &tsync);
430 code = rx_EndCall(tcall, code);
435 static StoreProc(acall, string, length)
436 register struct rx_call *acall;
440 afs_int32 tlen, code;
443 tlen = (length > 256? 256 : length);
444 code = rx_Write(acall, string, tlen);
457 struct afsStoreStatus InStatus;
458 struct afsFetchStatus OutStatus;
459 struct afsVolSync tsync;
461 int vnode, unique, mode, owner, length;
464 sscanf(&(*argp)[0], "%d", &vnode);
466 sscanf(&(*argp)[0], "%d", &unique);
468 memset(&fid, 0, sizeof(struct afsFid));
469 fid.Volume.low = 10; /* XXX */
472 memset(&InStatus, 0, sizeof(struct afsStoreStatus));
473 sscanf(&(*argp)[0], "%d", &mode);
475 sscanf(&(*argp)[0], "%d", &owner);
477 sscanf(&(*argp)[0], "%d", &length);
480 InStatus.mode = mode;
481 InStatus.mask |= AFS_SETMODE;
484 InStatus.owner = owner;
485 InStatus.mask |= AFS_SETOWNER;
488 InStatus.length = length;
489 InStatus.mask |= AFS_SETLENGTH;
491 code = ubik_Call(AFS_StoreStatus, cstruct, 0, &fid, &InStatus, &hyp0, 0,
500 struct afsFetchStatus OutStatus;
501 struct afsACL AccessList;
502 struct afsToken Token;
503 struct afsVolSync tsync;
509 sscanf(&(*argp)[0], "%d", &vnode);
511 sscanf(&(*argp)[0], "%d", &unique);
513 memset(&fid, 0, sizeof(struct afsFid));
514 fid.Volume.low = 10; /* XXX */
517 string = &argp[0][0];
519 AccessList.afsACL_len = strlen(string)+1;
520 AccessList.afsACL_val = string;
521 code = ubik_Call(AFS_StoreACL, cstruct, 0, &fid,
522 &AccessList, &hyp0, 0, &OutStatus, &tsync);
530 struct afsFetchStatus OutDirStatus, OutFidStatus;
531 struct afsVolSync tsync;
532 struct afsFidName nameFid;
533 struct afsFid fid, outFid;
538 sscanf(&(*argp)[0], "%d", &vnode);
540 sscanf(&(*argp)[0], "%d", &unique);
542 memset(&fid, 0, sizeof(struct afsFid));
543 fid.Volume.low = 10; /* XXX */
548 memset(&nameFid, 0, sizeof(struct afsFidName));
549 strcpy(nameFid.name, name);
550 code = ubik_Call(AFS_RemoveFile, cstruct, 0, &fid, &nameFid, &hyp0, 0,
551 &OutDirStatus, &OutFidStatus, &outFid, &tsync);
559 struct afsFetchStatus OutDirStatus, OutFidStatus;
560 struct afsStoreStatus InStatus;
561 struct afsVolSync tsync;
562 struct afsFid fid, outFid;
563 struct afsToken Token;
565 int vnode, unique, mode, owner, length;
568 sscanf(&(*argp)[0], "%d", &vnode);
570 sscanf(&(*argp)[0], "%d", &unique);
572 memset(&fid, 0, sizeof(struct afsFid));
573 fid.Volume.low = 10; /* XXX */
578 memset(&InStatus, 0, sizeof(struct afsStoreStatus));
579 sscanf(&(*argp)[0], "%d", &mode);
581 sscanf(&(*argp)[0], "%d", &owner);
583 sscanf(&(*argp)[0], "%d", &length);
586 InStatus.mode = mode;
587 InStatus.mask |= AFS_SETMODE;
590 InStatus.owner = owner;
591 InStatus.mask |= AFS_SETOWNER;
594 InStatus.length = length;
595 InStatus.mask |= AFS_SETLENGTH;
597 code = ubik_Call(AFS_CreateFile, cstruct, 0, &fid, name, &InStatus, &hyp0, 0,
598 &outFid, &OutFidStatus, &OutDirStatus, &Token, &tsync);
606 struct afsFetchStatus OutOldDirStatus, OutNewDirStatus;
607 struct afsFetchStatus OutOldFileStatus, OutNewFileStatus;
608 struct afsVolSync tsync;
609 struct afsFid OldDirFid, NewDirFid, OutOldFileFid, OutNewFileFid;
610 struct afsFidName OldName, NewName;
612 int ovnode, ounique, nvnode, nunique;
615 sscanf(&(*argp)[0], "%d", &ovnode);
617 sscanf(&(*argp)[0], "%d", &ounique);
619 memset(&OldDirFid, 0, sizeof(struct afsFid));
620 OldDirFid.Volume.low = 10; /* XXX */
621 OldDirFid.Vnode = ovnode;
622 OldDirFid.Unique = ounique;
625 memset(&OldName, 0, sizeof(struct afsFidName));
626 strcpy(OldName.name, oname);
627 sscanf(&(*argp)[0], "%d", &nvnode);
629 sscanf(&(*argp)[0], "%d", &nunique);
631 memset(&NewDirFid, 0, sizeof(struct afsFid));
632 NewDirFid.Volume.low = 10; /* XXX */
633 NewDirFid.Vnode = nvnode;
634 NewDirFid.Unique = nunique;
637 memset(&NewName, 0, sizeof(struct afsFidName));
638 strcpy(NewName.name, nname);
639 code = ubik_Call(AFS_Rename, cstruct, 0, &OldDirFid, &OldName, &NewDirFid, &NewName, &hyp0, 0,
640 &OutOldDirStatus, &OutNewDirStatus,
641 &OutOldFileFid, &OutOldFileStatus,
642 &OutNewFileFid, &OutNewFileStatus, &tsync);
650 struct afsFetchStatus OutDirStatus, OutFidStatus;
651 struct afsStoreStatus InStatus;
652 struct afsVolSync tsync;
653 struct afsFid fid, outFid;
654 struct afsToken Token;
655 char *name, *linkcontents;
656 int vnode, unique, mode, owner, length;
659 sscanf(&(*argp)[0], "%d", &vnode);
661 sscanf(&(*argp)[0], "%d", &unique);
663 memset(&fid, 0, sizeof(struct afsFid));
664 fid.Volume.low = 10; /* XXX */
669 linkcontents = &argp[0][0];
671 memset(&InStatus, 0, sizeof(struct afsStoreStatus));
672 sscanf(&(*argp)[0], "%d", &mode);
674 sscanf(&(*argp)[0], "%d", &owner);
676 sscanf(&(*argp)[0], "%d", &length);
679 InStatus.mode = mode;
680 InStatus.mask |= AFS_SETMODE;
683 InStatus.owner = owner;
684 InStatus.mask |= AFS_SETOWNER;
687 InStatus.length = length;
688 InStatus.mask |= AFS_SETLENGTH;
690 code = ubik_Call(AFS_Symlink, cstruct, 0, &fid, name, linkcontents, &InStatus, &hyp0, 0,
691 &outFid, &OutFidStatus, &OutDirStatus, &Token, &tsync);
699 struct afsFetchStatus OutDirStatus, OutFidStatus;
700 struct afsVolSync tsync;
701 struct afsFid fid, existingFid;
706 sscanf(&(*argp)[0], "%d", &vnode);
708 sscanf(&(*argp)[0], "%d", &unique);
710 memset(&fid, 0, sizeof(struct afsFid));
711 fid.Volume.low = 10; /* XXX */
716 sscanf(&(*argp)[0], "%d", &vnode);
718 sscanf(&(*argp)[0], "%d", &unique);
720 memset(&existingFid, 0, sizeof(struct afsFid));
721 existingFid.Volume.low = 10; /* XXX */
722 existingFid.Vnode = vnode;
723 existingFid.Unique = unique;
724 code = ubik_Call(AFS_HardLink, cstruct, 0, &fid, name, &existingFid, &hyp0, 0,
725 &OutFidStatus, &OutDirStatus, &tsync);
733 struct afsFetchStatus OutDirStatus, OutFidStatus;
734 struct afsStoreStatus InStatus;
735 struct afsVolSync tsync;
736 struct afsFid fid, outFid;
737 struct afsToken Token;
739 int vnode, unique, mode, owner, length;
742 sscanf(&(*argp)[0], "%d", &vnode);
744 sscanf(&(*argp)[0], "%d", &unique);
746 memset(&fid, 0, sizeof(struct afsFid));
747 fid.Volume.low = 10; /* XXX */
752 memset(&InStatus, 0, sizeof(struct afsStoreStatus));
753 sscanf(&(*argp)[0], "%d", &mode);
755 sscanf(&(*argp)[0], "%d", &owner);
757 sscanf(&(*argp)[0], "%d", &length);
760 InStatus.mode = mode;
761 InStatus.mask |= AFS_SETMODE;
764 InStatus.owner = owner;
765 InStatus.mask |= AFS_SETOWNER;
768 InStatus.length = length;
769 InStatus.mask |= AFS_SETLENGTH;
771 code = ubik_Call(AFS_MakeDir, cstruct, 0, &fid, name, &InStatus, &hyp0, 0,
772 &outFid, &OutFidStatus, &OutDirStatus, &Token, &tsync);
780 struct afsFetchStatus OutDirStatus;
781 struct afsVolSync tsync;
782 struct afsFid fid, outFid;
783 struct afsFidName nameFid;
788 sscanf(&(*argp)[0], "%d", &vnode);
790 sscanf(&(*argp)[0], "%d", &unique);
792 memset(&fid, 0, sizeof(struct afsFid));
793 fid.Volume.low = 10; /* XXX */
798 memset(&nameFid, 0, sizeof(struct afsFidName));
799 strcpy(nameFid.name, name);
800 code = ubik_Call(AFS_RemoveDir, cstruct, 0, &fid, &nameFid, &hyp0, 0,
801 &OutDirStatus, &outFid, &tsync);
809 struct afsFetchStatus OutDirStatus;
810 struct afsVolSync tsync;
812 struct afsToken Token;
814 struct rx_call *tcall;
815 int vnode, unique, offset, length, NextOffset;
818 sscanf(&(*argp)[0], "%d", &vnode);
820 sscanf(&(*argp)[0], "%d", &unique);
822 sscanf(&(*argp)[0], "%d", &offset);
824 sscanf(&(*argp)[0], "%d", &length);
826 memset(&fid, 0, sizeof(struct afsFid));
827 fid.Volume.low = 10; /* XXX */
830 tcall = rx_NewCall(cstruct->conns[0]);
831 code = StartAFS_Readdir(tcall, &fid, offset, length, &hyp0, 0);
833 code = FetchDir(tcall);
836 code = EndAFS_FetchData(tcall, &NextOffset, &OutDirStatus, &Token, &tsync);
838 code = rx_EndCall(tcall, code);
843 static FetchDir(acall)
844 register struct rx_call *acall;
846 extern char *malloc();
847 register char *tbuffer;
848 afs_int32 tlen, length, code;
852 tbuffer = malloc(256);
854 code = rx_Read(acall, &length, sizeof(afs_int32));
855 length = ntohl(length);
856 if (code != sizeof(afs_int32))
860 tlen = (length > 8192? 8192 : length);
861 code = rx_Read(acall, tbuffer, tlen);
868 dp = (struct dirent *)dp;
877 struct afsFetchStatus OutDirStatus, OutFidStatus;
878 struct afsVolSync tsync;
879 struct afsFid fid, outFid;
884 sscanf(&(*argp)[0], "%d", &vnode);
886 sscanf(&(*argp)[0], "%d", &unique);
888 memset(&fid, 0, sizeof(struct afsFid));
889 fid.Volume.low = 10; /* XXX */
894 code = ubik_Call(AFS_Lookup, cstruct, 0, &fid, name, &hyp0, 0,
895 &outFid, &OutFidStatus, &OutDirStatus, &tsync);
903 struct afsFetchStatus OutStatus;
904 struct afsVolSync tsync;
905 struct afsToken MinToken, RealToken;
907 int vnode, unique, tokenId;
910 sscanf(&(*argp)[0], "%d", &vnode);
912 sscanf(&(*argp)[0], "%d", &unique);
914 memset(&fid, 0, sizeof(struct afsFid));
915 fid.Volume.low = 10; /* XXX */
918 sscanf(&(*argp)[0], "%d", &tokenId);
920 memset(&MinToken, 0, sizeof(struct afsToken));
921 MinToken.tokenID.low = tokenId; /* XXX */
922 code = ubik_Call(AFS_GetToken, cstruct, 0, &fid, &MinToken, &hyp0, 0,
923 &RealToken, &OutStatus, &tsync);
942 /* printf("ka <vol.l> <vnode> <unique> <isExec> <kaTime>\n"); */
946 struct afsBulkFEX fex;
947 afs_uint32 numExec, spare4;
951 memset(&fx, 0, sizeof(struct afsFidExp));
952 sscanf(&(*argp)[0], "%d", &fx.fid.Volume.low);
954 sscanf(&(*argp)[0], "%d", &fx.fid.Vnode);
956 sscanf(&(*argp)[0], "%d", &fx.fid.Unique);
958 sscanf(&(*argp)[0], "%d", &numExec);
960 sscanf(&(*argp)[0], "%d", &fx.keepAliveTime);
961 memset(&fex, 0, sizeof(struct afsBulkFEX));
962 fex.afsBulkFEX_val = &fx;
963 fex.afsBulkFEX_len = 1;
964 code = ubik_Call(AFS_BulkKeepAlive, cstruct, 0, &fex, numExec, 0, 0, 0, &spare4);