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>
20 #include <WINNT/afsevent.h>
25 #include <afs/rxgen_consts.h>
28 #include <afs/cellconfig.h>
29 #include <afs/afsutil.h>
30 #include <afs/com_err.h>
35 #include "ptprototypes.h"
37 static char *whoami = "testpr";
38 static struct afsconf_dir *conf; /* cell info, set by MyBeforeProc */
39 static char conf_dir[100];
40 static char lcell[MAXCELLCHARS];
43 ListUsedIds(struct cmd_syndesc *as, void *arock)
49 int group = 0; /* check groups */
50 int unused = 0; /* print unused */
51 int number = 100; /* check 100 ids */
52 afs_int32 startId = 1;
56 if (as->parms[0].items)
57 startId = atoi(as->parms[0].items->data);
58 if (as->parms[1].items)
59 number = atoi(as->parms[1].items->data);
60 if (as->parms[2].items)
63 code = pr_Initialize(1, conf_dir, NULL);
65 afs_com_err(whoami, code, "initializing pruser");
70 code = pr_ListMaxGroupId(&maxId);
73 afs_com_err(whoami, code, "getting maximum id");
76 if (startId < maxId) {
77 fprintf(stderr, "Max group id is only %d.\n", maxId);
81 code = pr_ListMaxUserId(&maxId);
84 if (startId > maxId) {
85 fprintf(stderr, "Max user id is only %d.\n", maxId);
89 range = abs(startId - maxId);
90 range++; /* number that can be printed */
92 fprintf(stderr, "Only %d ids to be checked.\n", range);
96 printf("Checking for %d %sused ids starting at %d.\n", number,
97 (unused ? "un" : ""), startId);
99 lids.idlist_val = malloc(sizeof(afs_int32) * NUM);
100 lnames.namelist_len = 0;
101 lnames.namelist_val = 0;
107 for (j = 0; j < i; j++) {
108 lids.idlist_val[j] = startId;
115 code = pr_IdToName(&lids, &lnames);
117 afs_com_err(whoami, code, "converting id to name");
120 for (j = 0; j < lnames.namelist_len; j++) {
121 if (lids.idlist_val[j] == atoi(lnames.namelist_val[j])) {
123 printf("%s is free\n", lnames.namelist_val[j]);
126 printf("%s is id %d\n", lnames.namelist_val[j],
133 free(lids.idlist_val);
134 if (lnames.namelist_val)
135 free(lnames.namelist_val);
139 /* TestManyMembers - called with a number N. Try creating N users and N groups
140 * and put all the users on one of the groups and one of the users on all the
141 * groups. Also put many users on many groups.
143 * To keep track of this create an NxN matrix of membership and fill it in with
144 * a function that looks like a quarter of a circle. That makes the first
145 * group contain every user and the first user be a member of every group. */
148 char callerName[PR_MAXNAMELEN];
150 afs_int32 lastGroup; /* id of last group created */
151 afs_int32 ownerUser; /* first created user */
152 char ownerUserName[PR_MAXNAMELEN]; /* " " " name */
153 int steepDropOff; /* precentage decreate in GroupLimit */
154 char *createPrefix; /* prefix for naming users&groups */
155 extern struct ubik_client *pruclient; /* initialized by pr_Initialize */
157 /* These variables form the state if this test */
158 int number; /* max number of members */
159 char *population; /* matrix of memberships */
160 afs_int32 *users; /* ids of users */
161 afs_int32 *groups; /* ids of groups */
162 afs_int32 *groupOwners; /* ids of owners of groups */
165 int nUsers, nGroups, nAdds, nRems, nUDels, nGDels;
168 IdCmp(const void *a, const void *b)
170 if (*(afs_int32 *)a > *(afs_int32 *)b) {
172 } else if (*(afs_int32 *)a == *(afs_int32 *)b) {
174 } else /* (*a < *b) */ {
186 GetGroupLimit(int N, int x)
190 if ((x >= N) || (x < 0)) {
191 printf("GetGroupLimit: input value out of range %d (%d)\n", x, N);
194 if (steepDropOff) { /* Use exponential decrease */
197 for (i = 0; i < x; i++) {
198 y = (y * steepDropOff) / 100; /* parameter is a percentage */
200 y = 1; /* with a floor of 1 */
204 } else { /* Use a circle's third quadrant */
205 y = sqr(N - 1) - sqr(N - 1 - x);
206 y = (int)(sqrt((double)y) + 0.5); /* round off */
209 if ((y > N) || (y < 1)) {
210 printf("filling value out of range: %d (%d) => %d\n", x, N, y);
223 sprintf(name, "%s%d", createPrefix, u);
225 code = pr_CreateUser(name, &id);
227 if (code == PREXIST) {
228 code = pr_Delete(name);
231 code = pr_CreateUser(name, &id);
239 afs_com_err(whoami, code, "couldn't create %s", name);
244 printf("Creating user %s (%di)\n", name, id);
248 if (ownerUser == 0) {
250 strcpy(ownerUserName, name);
258 char name[PR_MAXNAMELEN + 1];
261 char *ownerName = NULL;
262 int ownerType; /* type of ownership */
263 static char *lastGroupPrefix; /* prefix used for type==2 */
265 /* At least 50 groups should be owned by another group to test long owner
266 * chains during deletion. Also let's create some long owners of owners
268 ownerType = random() % 3;
277 ownerName = callerName;
281 ownerName = ownerUserName;
285 ownerName = lastGroupPrefix;
289 code = snprintf(name, sizeof(name), "%s:%s%d", ownerName, createPrefix, g);
290 if (code >= sizeof(name)) {
291 fprintf(stderr, "%s: generated group name is too long: %s:%s%d\n",
292 whoami, ownerName, createPrefix, g);
295 code = ubik_PR_NewEntry(pruclient, 0, name, PRGRP, owner, &id);
297 if (code == PREXIST) {
298 code = pr_Delete(name);
302 ubik_PR_NewEntry(pruclient, 0, name, PRGRP, owner,
311 afs_com_err(whoami, code, "couldn't create %s w/ owner=%d", name, owner);
316 printf("Creating group %s (%di)\n", name, id);
318 groupOwners[g] = owner;
320 if (!lastGroup || (ownerType == 2)) {
322 lastGroupPrefix = ownerName;
327 DeleteRandomId(afs_int32 *list)
334 k = random(); /* random starting point */
335 for (j = 0; j < number; j++) { /* find an undeleted id */
336 m = (k + j) % number;
337 if ((id = list[m])) {
338 code = ubik_PR_Delete(pruclient, 0, id);
340 afs_com_err(whoami, code, "Couldn't delete %di", id);
351 return -1; /* none left */
355 AddUser(int u, int g)
360 if (users[u] == 0) /* create if necessary */
362 if (groups[g] == 0) /* create group if necessary */
366 code = ubik_PR_AddToGroup(pruclient, 0, ui, gi);
368 afs_com_err(whoami, code, "couldn't add %d to %d", ui, gi);
372 printf("Adding user (%di) to group (%di)\n", ui, gi);
373 population[u * number + g]++;
378 RemUser(int u, int g)
385 code = ubik_PR_RemoveFromGroup(pruclient, 0, ui, gi);
387 afs_com_err(whoami, code, "couldn't remove %d from %d", ui, gi);
391 printf("Removing user (%di) from group (%di)\n", ui, gi);
392 population[u * number + g]--;
397 TestManyMembers(struct cmd_syndesc *as, void *arock)
399 char *filled; /* users filled up */
400 char *cleaned; /* users cleaned up */
402 int nFilled, nCleaned;
404 int seed; /* random number generator seed */
406 afs_int32 *glist; /* membership list */
410 code = pr_Initialize(1, conf_dir, NULL);
412 afs_com_err(whoami, code, "initializing pruser");
415 /* get name of person running command */
417 struct ktc_principal afs, user;
418 struct ktc_token token;
420 strcpy(afs.name, "afs");
421 strcpy(afs.instance, "");
422 code = afsconf_GetLocalCell(conf, afs.cell, sizeof(afs.cell));
425 code = ktc_GetToken(&afs, &token, sizeof(token), &user);
427 afs_com_err(whoami, code, "getting afs tokens");
430 if (strlen(user.instance) > 0) {
431 fprintf(stderr, "can't handle non-null instance %s.%s\n",
432 user.name, user.cell);
435 if (strncmp(user.name, "AFS ID ", 7) == 0) {
436 callerId = atoi(user.name + 7);
437 code = pr_SIdToName(callerId, callerName);
439 afs_com_err(whoami, code, "call get name for id %d", callerId);
443 strcpy(callerName, user.name);
444 code = pr_SNameToId(callerName, &callerId);
445 if ((code == 0) && (callerId == ANONYMOUSID))
448 #if 0 /* don't create user */
449 if (code == PRNOENT) {
451 code = pr_CreateUser(callerName, &callerId);
453 afs_com_err(whoami, code, "can't create caller %s", callerName);
456 printf("Creating caller %s (%di)\n", callerName, callerId);
461 afs_com_err(whoami, code, "can't find caller %s", callerName);
464 printf("Assuming caller is %s (%di)\n", callerName, callerId);
467 /* Parse arguments */
468 if (as->parms[0].items)
469 number = atoi(as->parms[0].items->data);
470 if (as->parms[1].items) {
471 steepDropOff = atoi(as->parms[1].items->data);
472 if ((steepDropOff < 0) || (steepDropOff > 100)) {
474 "Illegal value for dropoff: %d, must be between 0 and 100, inclusive.\n",
479 steepDropOff = 0; /* use quadratic dropoff */
480 if (as->parms[2].items)
481 createPrefix = as->parms[2].items->data;
484 if (as->parms[3].items)
488 if (as->parms[4].items)
489 seed = atoi(as->parms[4].items->data);
495 users = calloc(number, sizeof(afs_int32));
496 groups = calloc(number, sizeof(afs_int32));
497 filled = calloc(number, sizeof(char));
498 cleaned = calloc(number, sizeof(char));
499 population = calloc(sqr(number), sizeof(char));
504 ownerUser = lastGroup = 0;
505 groupOwners = malloc(number * sizeof(afs_int32));
506 nUsers = nGroups = nAdds = nRems = nUDels = nGDels = 0;
508 while ((nFilled < number) || (nCleaned < number)) {
509 /* pick a user at random, using */
510 u = random() % number;
512 n = GetGroupLimit(number, u); /* get group limit for that user */
513 g = random() % (n + 1); /* pick a random group */
514 if (g == n) { /* in a few cases create any user */
515 n = number; /* in the whole range */
518 for (i = 0; i < n; i++) { /* rotate until unused one found */
520 if (!population[u * number + j]) {
521 /* add this user/group membership */
532 if (filled[u]) { /* only clean above GroupLimit */
533 base = GetGroupLimit(number, u);
540 n = number; /* pick a group from the whole range */
541 g = random() % 2 * n; /* at random for removal */
543 goto remed; /* but half the time do nothing */
545 for (i = 0; i < n; i++) { /* rotate until used one found */
546 j = (g + i) % n + base;
547 if (population[u * number + j]) {
548 /* remove this user/group membership */
553 if (filled[u]) { /* track finished ones */
562 /* check the membership list of all users for correctness */
563 printf("Starting check of memberships\n");
564 glist = malloc(number * sizeof(afs_int32));
565 for (u = 0; u < number; u++) {
566 afs_int32 ui = users[u];
569 int ng; /* number groups */
571 int (*proc)(struct ubik_client *, afs_int32, afs_int32, prlist *,
575 alist.prlist_len = 0;
576 alist.prlist_val = 0;
578 proc = ubik_PR_ListElements;
580 proc = ubik_PR_GetCPS;
582 code = (*proc)(pruclient, 0, ui, &alist, &over);
584 afs_com_err(whoami, code,
585 "getting membership list of (%di) using %s", ui,
586 (proc == ubik_PR_ListElements?"ListElements":"GetCPS"));
590 fprintf(stderr, "membership list for id %di too long\n", ui);
593 for (i = 0; i < number; i++)
594 if (population[u * number + i])
595 glist[ng++] = groups[i];
596 qsort(glist, ng, sizeof(afs_int32), IdCmp);
597 if (ng != (alist.prlist_len - ((proc == ubik_PR_GetCPS) ? 3 : 0))) {
599 "Membership list for %di of unexpected length: was %d but expected %d\n",
600 ui, alist.prlist_len, ng);
603 /* all the extra entries for the CPS should be at the end. */
605 for (i = 0; i < ng; i++)
606 if (alist.prlist_val[i] != glist[i]) {
608 "membership for %di not correct: was %di but expected %di\n",
609 ui, alist.prlist_val[i], glist[i]);
614 if (proc == ubik_PR_GetCPS) {
615 if ((alist.prlist_val[i /* =ng */ ] != AUTHUSERID) ||
616 (alist.prlist_val[++i] != ANYUSERID)
617 || (alist.prlist_val[++i] != ui)) {
618 fprintf(stderr, "CPS doesn't have extra entries\n");
622 if (alist.prlist_val)
623 free(alist.prlist_val);
625 /* User 0 is a member of all groups all of which should also be on
626 * the owner list of the caller or the ownerUser, although there
627 * may also be others. Check this. */
631 prlist lastGroupList;
635 fprintf(stderr, "User 0 not a member of all groups\n");
638 #define GETOWNED(xlist,xid) \
639 (xlist).prlist_val = 0; (xlist).prlist_len = 0; \
640 code = ubik_PR_ListOwned(pruclient, 0, (xid), &(xlist), &over); \
642 afs_com_err (whoami, code, "getting owner list of (%di)", (xid)); \
645 { fprintf (stderr, "membership of id %di too long\n", (xid)); }
647 GETOWNED(callerList, callerId);
648 GETOWNED(ownerList, ownerUser);
650 /* look for every entry in glist, in all the owner lists */
651 for (i = j = k = l = 0; i < number; i++) {
652 while ((j < callerList.prlist_len)
653 && (callerList.prlist_val[j] < glist[i]))
655 while ((k < ownerList.prlist_len)
656 && (ownerList.prlist_val[k] < glist[i]))
658 #define PRLISTCMP(l,i) \
659 (((l).prlist_len == 0) || (glist[i] != (l).prlist_val[(i)]))
660 if (PRLISTCMP(callerList, j) && PRLISTCMP(ownerList, k)) {
661 for (l = 0; l < number; l++) {
662 if (groups[l] == glist[i]) {
663 if ((groupOwners[l] != callerId)
664 && (groupOwners[l] != ownerUser)) {
665 GETOWNED(lastGroupList, groupOwners[l]);
666 if ((lastGroupList.prlist_len != 1)
667 || (lastGroupList.prlist_val[0] !=
670 "Group (%di) not on any owner list\n",
678 fprintf(stderr, "unexpected group %di\n", glist[i]);
682 if (callerList.prlist_val)
683 free(callerList.prlist_val);
684 if (ownerList.prlist_val)
685 free(ownerList.prlist_val);
686 if (lastGroupList.prlist_val)
687 free(lastGroupList.prlist_val);
692 /* cleanup by deleting all the users and groups */
693 printf("Starting deletion of users and groups\n");
694 for (i = 0; i < number; i++) {
695 DeleteRandomId(users);
696 DeleteRandomId(groups);
700 ("Created/deleted %d/%d users and %d/%d groups; added %d and removed %d.\n",
701 nUsers, nUDels, nGroups, nGDels, nAdds, nRems);
705 /* from ka_ConvertBytes included here to avoid circularity */
706 /* Converts a byte string to ascii. Return the number of unconverted bytes. */
709 ka_ConvertBytes(char *ascii, /* output buffer */
710 int alen, /* buffer length */
711 char bs[], /* byte string */
712 int bl) /* number of bytes */
717 alen--; /* make room for termination */
718 for (i = 0; i < bl; i++) {
722 if (isalnum(c) || ispunct(c))
723 (*ascii++ = c), alen--;
728 *ascii++ = (c >> 6) + '0';
729 *ascii++ = (c >> 3 & 7) + '0';
730 *ascii++ = (c & 7) + '0';
734 *ascii = 0; /* terminate string */
738 /* This runs various tests on the server. It creates, then deletes, a bunch of
739 * users and groups, so it would be safest to run it on a test database.
741 * These are the things I check for:
742 * User names longer than PR_MAXNAMELEN - strlen(cellname).
743 * Group names longer than PR_MAXNAMELEN.
744 * User names containing all legal 8-bit ascii characters. This excludes
745 * only ':', '@', and '\n'.
746 * Group names as above, but at least one colon is required, and the owner
751 TestPrServ(struct cmd_syndesc *as, void *arock)
754 char name[PR_MAXNAMELEN + 1];
755 char creator[PR_MAXNAMELEN]; /* our name */
756 struct prcheckentry ent;
759 int maxLen = PR_MAXNAMELEN - 1 - strlen(lcell) - 1;
761 code = pr_Initialize(1, conf_dir, NULL);
763 afs_com_err(whoami, code, "initializing pruser");
767 for (i = 0; i < maxLen; i++)
769 name[i] = 'a'; /* too long a name... */
772 code = pr_CreateUser(name, &id);
773 if ((code != RXGEN_CC_MARSHAL) && (code != PRBADNAM)) {
774 afs_com_err(whoami, code, "succeeded creating %s", name);
779 code = pr_CreateUser(name, &id);
780 if (code == PREXIST) {
781 fprintf(stderr, "group already exists, skipping\n");
782 pr_SNameToId(name, &id);
784 afs_com_err(whoami, code, "failed creating %s", name);
787 if ((code = pr_ListEntry(id, &ent))
788 || (code = pr_SIdToName(ent.creator, creator))) {
789 afs_com_err(whoami, code, "getting creator's name");
792 code = pr_DeleteByID(id);
794 afs_com_err(whoami, code, "deleting %s", name);
797 /* now make sure the illegal chars are detected */
800 for (illegalChars = "@:\n"; *illegalChars; illegalChars++) {
801 name[10] = *illegalChars;
803 code = pr_CreateUser(name, &id);
804 if (code != PRBADNAM) {
805 afs_com_err(whoami, code, "succeeded creating %s", name);
811 for (i = 1; i <= 255;) { /* for all 8-bit ascii... */
812 j = 0; /* build a new name */
813 while ((j < maxLen) && (i <= 255)) {
814 if (!((i == ':') || (i == '@') || (i == '\n')))
818 name[j] = 0; /* terminate string */
820 code = pr_CreateUser(name, &id);
821 if (code == PREXIST) {
822 fprintf(stderr, "user already exists, skipping\n");
823 pr_SNameToId(name, &id);
826 ka_ConvertBytes(ascii, sizeof(ascii), name, strlen(name));
827 afs_com_err(whoami, code, "failed creating %s", ascii);
830 code = pr_DeleteByID(id);
832 afs_com_err(whoami, code, "deleting %s", name);
837 /* now check group names */
838 strcpy(name, creator);
839 strcat(name, ":abcdefghijklmnopqrstuvwxyz");
840 name[0] = 1; /* bash the owner name */
842 code = pr_CreateGroup(name, creator, &id);
843 if (code != PRNOENT) { /* owner doesn't exist */
844 afs_com_err(whoami, code, "succeeded creating %s", name);
847 name[0] = creator[0]; /* fix owner */
848 /* Make sure the illegal chars are detected */
851 for (illegalChars = ":@\n"; *illegalChars; illegalChars++) {
852 name[strlen(creator) + 10] = *illegalChars;
854 code = pr_CreateGroup(name, creator, &id);
855 if (code != PRBADNAM) {
856 afs_com_err(whoami, code, "succeeded creating %s", name);
861 for (i = 1; i <= 255;) { /* for all 8-bit ascii... */
862 j = strlen(creator) + 1; /* build a new name */
863 while ((j < PR_MAXNAMELEN - 1) && (i <= 255)) {
864 if (!((i == ':') || (i == '@') || (i == '\n')))
868 name[j] = 0; /* terminate string */
870 code = pr_CreateGroup(name, creator, &id);
871 if (code == PREXIST) {
872 fprintf(stderr, "group already exists, skipping\n");
873 pr_SNameToId(name, &id);
876 ka_ConvertBytes(ascii, sizeof(ascii), name, strlen(name));
877 afs_com_err(whoami, code, "failed creating %s", ascii);
880 code = pr_DeleteByID(id);
882 afs_com_err(whoami, code, "deleting %s", name);
891 static char tmp_conf_dir[128] = "";
892 static char tmp_conf_file[128] = "";
893 static char tmp_cell_file[128] = "";
894 static char tmp_noauth_file[128] = "";
897 MyAfterProc(struct cmd_syndesc *as, void *arock)
899 if (strlen(tmp_conf_file))
900 unlink(tmp_conf_file);
901 if (strlen(tmp_cell_file))
902 unlink(tmp_cell_file);
903 if (strlen(tmp_noauth_file))
904 unlink(tmp_noauth_file);
905 if (strlen(tmp_conf_dir))
911 MyBeforeProc(struct cmd_syndesc *as, void *arock)
917 struct cmd_item *serverList = 0;
918 struct afsconf_dir *local_conf = 0; /* so we can default stuff nicely */
919 struct afsconf_cell cellinfo;
921 if (as->parms[12].items) { /* if conf dir specified */
922 cdir = as->parms[12].items->data;
923 if (as->parms[13].items || as->parms[14].items || as->parms[15].items) {
924 printf("Can't specify conf dir and other cell parameters\n");
925 return AFSCONF_SYNTAX;
929 /* if we need to default cell name or cell servers, get local conf info */
931 if (!(local_conf = afsconf_Open(AFSDIR_CLIENT_ETC_DIRPATH))
932 && !(local_conf = afsconf_Open(AFSDIR_SERVER_ETC_DIRPATH))) {
933 printf("** Can't local configuration!\n");
934 return AFSCONF_NOCELL;
937 if (as->parms[13].items) { /* if cell name specified */
938 lcstring(lcell, as->parms[13].items->data, sizeof(lcell));
939 code = afsconf_GetCellInfo(local_conf, lcell, 0, &cellinfo);
941 strncpy(lcell, cellinfo.name, sizeof(lcell));
943 code = afsconf_GetLocalCell(local_conf, lcell, sizeof(lcell));
948 if (as->parms[14].items) { /* noauth flag */
952 if (as->parms[15].items) { /* servers list */
953 serverList = as->parms[15].items;
954 for (i = 0; serverList; i++, serverList = serverList->next) {
956 if (i >= MAXHOSTSPERCELL)
958 strncpy(cellinfo.hostName[i], serverList->data, MAXHOSTCHARS);
959 th = gethostbyname(cellinfo.hostName[i]);
962 memcpy(&cellinfo.hostAddr[i].sin_addr, th->h_addr,
964 cellinfo.hostAddr[i].sin_family = AF_INET;
965 cellinfo.hostAddr[i].sin_port = 0;
966 #ifdef STRUCT_SOCKADDR_HAS_SA_LEN
967 cellinfo.hostAddr[i].sin_len = sizeof(struct sockaddr_in);
970 cellinfo.numServers = i;
971 strcpy(cellinfo.name, lcell);
973 code = afsconf_GetCellInfo(local_conf, lcell, 0, &cellinfo);
979 afsconf_Close(local_conf);
984 sprintf(tmp_conf_dir, "%s/afsconf.%lu", gettmpdir(),
985 (unsigned long)getpid());
986 code = mkdir(tmp_conf_dir, 0777);
987 if ((code < 0) && (errno != EEXIST)) {
988 afs_com_err(whoami, errno, "can't create temporary afsconf dir: %s",
993 strcompose(tmp_conf_file, 128, tmp_conf_dir, "/",
994 AFSDIR_CELLSERVDB_FILE, (char *)NULL);
995 f = fopen(tmp_conf_file, "w");
998 afs_com_err(whoami, errno, "can't create conf file %s",
1002 fprintf(f, ">%s\n", lcell);
1003 for (i = 0; i < cellinfo.numServers; i++) {
1005 (unsigned char *)&cellinfo.hostAddr[i].sin_addr;
1006 fprintf(f, "%d.%d.%d.%d\t#%s\n", tp[0], tp[1], tp[2], tp[3],
1007 cellinfo.hostName[i]);
1009 if (fclose(f) == EOF) {
1011 afs_com_err(whoami, errno, "can't write to conf file %s",
1016 strcompose(tmp_cell_file, 128, tmp_conf_dir, "/",
1017 AFSDIR_THISCELL_FILE, (char *)NULL);
1018 f = fopen(tmp_cell_file, "w");
1021 fprintf(f, "%s", lcell);
1022 if (fclose(f) == EOF)
1025 strcompose(tmp_noauth_file, 128, tmp_conf_dir, "/",
1026 AFSDIR_NOAUTH_FILE, (char *)NULL);
1028 code = creat(tmp_noauth_file, 0777);
1029 if (code && (errno != EEXIST))
1031 } else { /* make sure file doesn't exist */
1032 code = unlink(tmp_noauth_file);
1033 if (code && (errno != ENOENT))
1038 strncpy(conf_dir, tmp_conf_dir, sizeof(conf_dir));
1039 conf = afsconf_Open(conf_dir);
1041 return AFSCONF_NOTFOUND;
1046 add_std_args(struct cmd_syndesc *ts)
1049 cmd_AddParm(ts, "-confdir", CMD_SINGLE, CMD_OPTIONAL,
1050 "AFS Conf dir pathname");
1051 cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_OPTIONAL, "Cell name");
1052 cmd_AddParm(ts, "-noauth", CMD_FLAG, CMD_OPTIONAL, "Don't authenticate");
1053 cmd_AddParm(ts, "-servers", CMD_LIST, CMD_OPTIONAL, "Server config");
1059 /* OK, this REALLY sucks bigtime, but I can't tell who is calling
1060 * afsconf_CheckAuth easily, and only *SERVERS* should be calling osi_audit
1061 * anyway. It's gonna give somebody fits to debug, I know, I know.
1066 #include "AFS_component_version_number.c"
1069 main(int argc, char *argv[])
1072 struct cmd_syndesc *ts; /* ptr to parsed command line syntax */
1075 initialize_CMD_error_table();
1076 initialize_ACFG_error_table();
1077 initialize_KTC_error_table();
1078 initialize_U_error_table();
1079 initialize_PT_error_table();
1080 initialize_RXK_error_table();
1083 /* initialize winsock */
1084 if (afs_winsockInit() < 0) {
1085 fprintf(stderr, "%s: couldn't initialize winsock. \n", whoami);
1090 cmd_SetBeforeProc(MyBeforeProc, NULL);
1091 cmd_SetAfterProc(MyAfterProc, NULL);
1093 ts = cmd_CreateSyntax("usedIds", ListUsedIds, NULL, 0,
1094 "Find used (or unused) user (or group) ids");
1095 cmd_AddParm(ts, "-startId", CMD_SINGLE, CMD_OPTIONAL,
1096 "id to start checking");
1097 cmd_AddParm(ts, "-number", CMD_SINGLE, CMD_OPTIONAL,
1098 "number of ids to check");
1099 cmd_AddParm(ts, "-unused", CMD_FLAG, CMD_OPTIONAL, "print unused ids");
1102 ts = cmd_CreateSyntax("initcmd", TestPrServ, NULL, 0, "test the prserver");
1105 ts = cmd_CreateSyntax("testmanymembers", TestManyMembers, NULL, 0,
1106 "test creating users and groups w/ many members");
1107 cmd_AddParm(ts, "-number", CMD_SINGLE, 0,
1108 "number of users/groups to create");
1109 cmd_AddParm(ts, "-dropoff", CMD_SINGLE, CMD_OPTIONAL,
1110 "precentage for exponential dropoff");
1111 cmd_AddParm(ts, "-prefix", CMD_SINGLE, CMD_OPTIONAL, "naming prefix");
1112 cmd_AddParm(ts, "-long", CMD_FLAG, CMD_OPTIONAL, "show progress");
1113 cmd_AddParm(ts, "-seed", CMD_SINGLE, CMD_OPTIONAL, "random number seed");
1115 cmd_CreateAlias(ts, "mm");
1118 code = cmd_Dispatch(argc, argv);
1120 afs_com_err(whoami, code, "calling cmd_Dispatch");