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
);
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 sprintf(name
, "%s:%s%d", ownerName
, createPrefix
, g
);
290 code
= ubik_PR_NewEntry(pruclient
, 0, name
, PRGRP
, owner
, &id
);
292 if (code
== PREXIST
) {
293 code
= pr_Delete(name
);
297 ubik_PR_NewEntry(pruclient
, 0, name
, PRGRP
, owner
,
306 afs_com_err(whoami
, code
, "couldn't create %s w/ owner=%d", name
, owner
);
311 printf("Creating group %s (%di)\n", name
, id
);
313 groupOwners
[g
] = owner
;
315 if (!lastGroup
|| (ownerType
== 2)) {
317 lastGroupPrefix
= ownerName
;
322 DeleteRandomId(afs_int32
*list
)
329 k
= random(); /* random starting point */
330 for (j
= 0; j
< number
; j
++) { /* find an undeleted id */
331 m
= (k
+ j
) % number
;
332 if ((id
= list
[m
])) {
333 code
= ubik_PR_Delete(pruclient
, 0, id
);
335 afs_com_err(whoami
, code
, "Couldn't delete %di", id
);
346 return -1; /* none left */
350 AddUser(int u
, int g
)
355 if (users
[u
] == 0) /* create if necessary */
357 if (groups
[g
] == 0) /* create group if necessary */
361 code
= ubik_PR_AddToGroup(pruclient
, 0, ui
, gi
);
363 afs_com_err(whoami
, code
, "couldn't add %d to %d", ui
, gi
);
367 printf("Adding user (%di) to group (%di)\n", ui
, gi
);
368 population
[u
* number
+ g
]++;
373 RemUser(int u
, int g
)
380 code
= ubik_PR_RemoveFromGroup(pruclient
, 0, ui
, gi
);
382 afs_com_err(whoami
, code
, "couldn't remove %d from %d", ui
, gi
);
386 printf("Removing user (%di) from group (%di)\n", ui
, gi
);
387 population
[u
* number
+ g
]--;
392 TestManyMembers(struct cmd_syndesc
*as
, void *arock
)
394 char *filled
; /* users filled up */
395 char *cleaned
; /* users cleaned up */
397 int nFilled
, nCleaned
;
399 int seed
; /* random number generator seed */
401 afs_int32
*glist
; /* membership list */
405 code
= pr_Initialize(1, conf_dir
, NULL
);
407 afs_com_err(whoami
, code
, "initializing pruser");
410 /* get name of person running command */
412 struct ktc_principal afs
, user
;
413 struct ktc_token token
;
415 strcpy(afs
.name
, "afs");
416 strcpy(afs
.instance
, "");
417 code
= afsconf_GetLocalCell(conf
, afs
.cell
, sizeof(afs
.cell
));
420 code
= ktc_GetToken(&afs
, &token
, sizeof(token
), &user
);
422 afs_com_err(whoami
, code
, "getting afs tokens");
425 if (strlen(user
.instance
) > 0) {
426 fprintf(stderr
, "can't handle non-null instance %s.%s\n",
427 user
.name
, user
.cell
);
430 if (strncmp(user
.name
, "AFS ID ", 7) == 0) {
431 callerId
= atoi(user
.name
+ 7);
432 code
= pr_SIdToName(callerId
, callerName
);
434 afs_com_err(whoami
, code
, "call get name for id %d", callerId
);
438 strcpy(callerName
, user
.name
);
439 code
= pr_SNameToId(callerName
, &callerId
);
440 if ((code
== 0) && (callerId
== ANONYMOUSID
))
443 #if 0 /* don't create user */
444 if (code
== PRNOENT
) {
446 code
= pr_CreateUser(callerName
, &callerId
);
448 afs_com_err(whoami
, code
, "can't create caller %s", callerName
);
451 printf("Creating caller %s (%di)\n", callerName
, callerId
);
456 afs_com_err(whoami
, code
, "can't find caller %s", callerName
);
459 printf("Assuming caller is %s (%di)\n", callerName
, callerId
);
462 /* Parse arguments */
463 if (as
->parms
[0].items
)
464 number
= atoi(as
->parms
[0].items
->data
);
465 if (as
->parms
[1].items
) {
466 steepDropOff
= atoi(as
->parms
[1].items
->data
);
467 if ((steepDropOff
< 0) || (steepDropOff
> 100)) {
469 "Illegal value for dropoff: %d, must be between 0 and 100, inclusive.\n",
474 steepDropOff
= 0; /* use quadratic dropoff */
475 if (as
->parms
[2].items
)
476 createPrefix
= as
->parms
[2].items
->data
;
479 if (as
->parms
[3].items
)
483 if (as
->parms
[4].items
)
484 seed
= atoi(as
->parms
[4].items
->data
);
490 users
= calloc(number
, sizeof(afs_int32
));
491 groups
= calloc(number
, sizeof(afs_int32
));
492 filled
= calloc(number
, sizeof(char));
493 cleaned
= calloc(number
, sizeof(char));
494 population
= calloc(sqr(number
), sizeof(char));
499 ownerUser
= lastGroup
= 0;
500 groupOwners
= malloc(number
* sizeof(afs_int32
));
501 nUsers
= nGroups
= nAdds
= nRems
= nUDels
= nGDels
= 0;
503 while ((nFilled
< number
) || (nCleaned
< number
)) {
504 /* pick a user at random, using */
505 u
= random() % number
;
507 n
= GetGroupLimit(number
, u
); /* get group limit for that user */
508 g
= random() % (n
+ 1); /* pick a random group */
509 if (g
== n
) { /* in a few cases create any user */
510 n
= number
; /* in the whole range */
513 for (i
= 0; i
< n
; i
++) { /* rotate until unused one found */
515 if (!population
[u
* number
+ j
]) {
516 /* add this user/group membership */
527 if (filled
[u
]) { /* only clean above GroupLimit */
528 base
= GetGroupLimit(number
, u
);
535 n
= number
; /* pick a group from the whole range */
536 g
= random() % 2 * n
; /* at random for removal */
538 goto remed
; /* but half the time do nothing */
540 for (i
= 0; i
< n
; i
++) { /* rotate until used one found */
541 j
= (g
+ i
) % n
+ base
;
542 if (population
[u
* number
+ j
]) {
543 /* remove this user/group membership */
548 if (filled
[u
]) { /* track finished ones */
557 /* check the membership list of all users for correctness */
558 printf("Starting check of memberships\n");
559 glist
= malloc(number
* sizeof(afs_int32
));
560 for (u
= 0; u
< number
; u
++) {
561 afs_int32 ui
= users
[u
];
564 int ng
; /* number groups */
566 int (*proc
)(struct ubik_client
*, afs_int32
, afs_int32
, prlist
*,
570 alist
.prlist_len
= 0;
571 alist
.prlist_val
= 0;
573 proc
= ubik_PR_ListElements
;
575 proc
= ubik_PR_GetCPS
;
577 code
= (*proc
)(pruclient
, 0, ui
, &alist
, &over
);
579 afs_com_err(whoami
, code
,
580 "getting membership list of (%di) using %s", ui
,
581 (proc
== ubik_PR_ListElements
?"ListElements":"GetCPS"));
585 fprintf(stderr
, "membership list for id %di too long\n", ui
);
588 for (i
= 0; i
< number
; i
++)
589 if (population
[u
* number
+ i
])
590 glist
[ng
++] = groups
[i
];
591 qsort(glist
, ng
, sizeof(afs_int32
), IdCmp
);
592 if (ng
!= (alist
.prlist_len
- ((proc
== ubik_PR_GetCPS
) ? 3 : 0))) {
594 "Membership list for %di of unexpected length: was %d but expected %d\n",
595 ui
, alist
.prlist_len
, ng
);
598 /* all the extra entries for the CPS should be at the end. */
600 for (i
= 0; i
< ng
; i
++)
601 if (alist
.prlist_val
[i
] != glist
[i
]) {
603 "membership for %di not correct: was %di but expected %di\n",
604 ui
, alist
.prlist_val
[i
], glist
[i
]);
609 if (proc
== ubik_PR_GetCPS
) {
610 if ((alist
.prlist_val
[i
/* =ng */ ] != AUTHUSERID
) ||
611 (alist
.prlist_val
[++i
] != ANYUSERID
)
612 || (alist
.prlist_val
[++i
] != ui
)) {
613 fprintf(stderr
, "CPS doesn't have extra entries\n");
617 if (alist
.prlist_val
)
618 free(alist
.prlist_val
);
620 /* User 0 is a member of all groups all of which should also be on
621 * the owner list of the caller or the ownerUser, although there
622 * may also be others. Check this. */
626 prlist lastGroupList
;
630 fprintf(stderr
, "User 0 not a member of all groups\n");
633 #define GETOWNED(xlist,xid) \
634 (xlist).prlist_val = 0; (xlist).prlist_len = 0; \
635 code = ubik_PR_ListOwned(pruclient, 0, (xid), &(xlist), &over); \
637 afs_com_err (whoami, code, "getting owner list of (%di)", (xid)); \
640 { fprintf (stderr, "membership of id %di too long\n", (xid)); }
642 GETOWNED(callerList
, callerId
);
643 GETOWNED(ownerList
, ownerUser
);
645 /* look for every entry in glist, in all the owner lists */
646 for (i
= j
= k
= l
= 0; i
< number
; i
++) {
647 while ((j
< callerList
.prlist_len
)
648 && (callerList
.prlist_val
[j
] < glist
[i
]))
650 while ((k
< ownerList
.prlist_len
)
651 && (ownerList
.prlist_val
[k
] < glist
[i
]))
653 #define PRLISTCMP(l,i) \
654 (((l).prlist_len == 0) || (glist[i] != (l).prlist_val[(i)]))
655 if (PRLISTCMP(callerList
, j
) && PRLISTCMP(ownerList
, k
)) {
656 for (l
= 0; l
< number
; l
++) {
657 if (groups
[l
] == glist
[i
]) {
658 if ((groupOwners
[l
] != callerId
)
659 && (groupOwners
[l
] != ownerUser
)) {
660 GETOWNED(lastGroupList
, groupOwners
[l
]);
661 if ((lastGroupList
.prlist_len
!= 1)
662 || (lastGroupList
.prlist_val
[0] !=
665 "Group (%di) not on any owner list\n",
673 fprintf(stderr
, "unexpected group %di\n", glist
[i
]);
677 if (callerList
.prlist_val
)
678 free(callerList
.prlist_val
);
679 if (ownerList
.prlist_val
)
680 free(ownerList
.prlist_val
);
681 if (lastGroupList
.prlist_val
)
682 free(lastGroupList
.prlist_val
);
687 /* cleanup by deleting all the users and groups */
688 printf("Starting deletion of users and groups\n");
689 for (i
= 0; i
< number
; i
++) {
690 DeleteRandomId(users
);
691 DeleteRandomId(groups
);
695 ("Created/deleted %d/%d users and %d/%d groups; added %d and removed %d.\n",
696 nUsers
, nUDels
, nGroups
, nGDels
, nAdds
, nRems
);
700 /* from ka_ConvertBytes included here to avoid circularity */
701 /* Converts a byte string to ascii. Return the number of unconverted bytes. */
704 ka_ConvertBytes(char *ascii
, /* output buffer */
705 int alen
, /* buffer length */
706 char bs
[], /* byte string */
707 int bl
) /* number of bytes */
712 alen
--; /* make room for termination */
713 for (i
= 0; i
< bl
; i
++) {
717 if (isalnum(c
) || ispunct(c
))
718 (*ascii
++ = c
), alen
--;
723 *ascii
++ = (c
>> 6) + '0';
724 *ascii
++ = (c
>> 3 & 7) + '0';
725 *ascii
++ = (c
& 7) + '0';
729 *ascii
= 0; /* terminate string */
733 /* This runs various tests on the server. It creates, then deletes, a bunch of
734 * users and groups, so it would be safest to run it on a test database.
736 * These are the things I check for:
737 * User names longer than PR_MAXNAMELEN - strlen(cellname).
738 * Group names longer than PR_MAXNAMELEN.
739 * User names containing all legal 8-bit ascii characters. This excludes
740 * only ':', '@', and '\n'.
741 * Group names as above, but at least one colon is required, and the owner
746 TestPrServ(struct cmd_syndesc
*as
, void *arock
)
749 char name
[PR_MAXNAMELEN
+ 1];
750 char creator
[PR_MAXNAMELEN
]; /* our name */
751 struct prcheckentry ent
;
754 int maxLen
= PR_MAXNAMELEN
- 1 - strlen(lcell
) - 1;
756 code
= pr_Initialize(1, conf_dir
, NULL
);
758 afs_com_err(whoami
, code
, "initializing pruser");
762 for (i
= 0; i
< maxLen
; i
++)
764 name
[i
] = 'a'; /* too long a name... */
767 code
= pr_CreateUser(name
, &id
);
768 if ((code
!= RXGEN_CC_MARSHAL
) && (code
!= PRBADNAM
)) {
769 afs_com_err(whoami
, code
, "succeeded creating %s", name
);
774 code
= pr_CreateUser(name
, &id
);
775 if (code
== PREXIST
) {
776 fprintf(stderr
, "group already exists, skipping\n");
777 pr_SNameToId(name
, &id
);
779 afs_com_err(whoami
, code
, "failed creating %s", name
);
782 if ((code
= pr_ListEntry(id
, &ent
))
783 || (code
= pr_SIdToName(ent
.creator
, creator
))) {
784 afs_com_err(whoami
, code
, "getting creator's name");
787 code
= pr_DeleteByID(id
);
789 afs_com_err(whoami
, code
, "deleting %s", name
);
792 /* now make sure the illegal chars are detected */
795 for (illegalChars
= "@:\n"; *illegalChars
; illegalChars
++) {
796 name
[10] = *illegalChars
;
798 code
= pr_CreateUser(name
, &id
);
799 if (code
!= PRBADNAM
) {
800 afs_com_err(whoami
, code
, "succeeded creating %s", name
);
806 for (i
= 1; i
<= 255;) { /* for all 8-bit ascii... */
807 j
= 0; /* build a new name */
808 while ((j
< maxLen
) && (i
<= 255)) {
809 if (!((i
== ':') || (i
== '@') || (i
== '\n')))
813 name
[j
] = 0; /* terminate string */
815 code
= pr_CreateUser(name
, &id
);
816 if (code
== PREXIST
) {
817 fprintf(stderr
, "user already exists, skipping\n");
818 pr_SNameToId(name
, &id
);
821 ka_ConvertBytes(ascii
, sizeof(ascii
), name
, strlen(name
));
822 afs_com_err(whoami
, code
, "failed creating %s", ascii
);
825 code
= pr_DeleteByID(id
);
827 afs_com_err(whoami
, code
, "deleting %s", name
);
832 /* now check group names */
833 strcpy(name
, creator
);
834 strcat(name
, ":abcdefghijklmnopqrstuvwxyz");
835 name
[0] = 1; /* bash the owner name */
837 code
= pr_CreateGroup(name
, creator
, &id
);
838 if (code
!= PRNOENT
) { /* owner doesn't exist */
839 afs_com_err(whoami
, code
, "succeeded creating %s", name
);
842 name
[0] = creator
[0]; /* fix owner */
843 /* Make sure the illegal chars are detected */
846 for (illegalChars
= ":@\n"; *illegalChars
; illegalChars
++) {
847 name
[strlen(creator
) + 10] = *illegalChars
;
849 code
= pr_CreateGroup(name
, creator
, &id
);
850 if (code
!= PRBADNAM
) {
851 afs_com_err(whoami
, code
, "succeeded creating %s", name
);
856 for (i
= 1; i
<= 255;) { /* for all 8-bit ascii... */
857 j
= strlen(creator
) + 1; /* build a new name */
858 while ((j
< PR_MAXNAMELEN
- 1) && (i
<= 255)) {
859 if (!((i
== ':') || (i
== '@') || (i
== '\n')))
863 name
[j
] = 0; /* terminate string */
865 code
= pr_CreateGroup(name
, creator
, &id
);
866 if (code
== PREXIST
) {
867 fprintf(stderr
, "group already exists, skipping\n");
868 pr_SNameToId(name
, &id
);
871 ka_ConvertBytes(ascii
, sizeof(ascii
), name
, strlen(name
));
872 afs_com_err(whoami
, code
, "failed creating %s", ascii
);
875 code
= pr_DeleteByID(id
);
877 afs_com_err(whoami
, code
, "deleting %s", name
);
886 static char tmp_conf_dir
[128] = "";
887 static char tmp_conf_file
[128] = "";
888 static char tmp_cell_file
[128] = "";
889 static char tmp_noauth_file
[128] = "";
892 MyAfterProc(struct cmd_syndesc
*as
, void *arock
)
894 if (strlen(tmp_conf_file
))
895 unlink(tmp_conf_file
);
896 if (strlen(tmp_cell_file
))
897 unlink(tmp_cell_file
);
898 if (strlen(tmp_noauth_file
))
899 unlink(tmp_noauth_file
);
900 if (strlen(tmp_conf_dir
))
906 MyBeforeProc(struct cmd_syndesc
*as
, void *arock
)
912 struct cmd_item
*serverList
= 0;
913 struct afsconf_dir
*local_conf
= 0; /* so we can default stuff nicely */
914 struct afsconf_cell cellinfo
;
916 if (as
->parms
[12].items
) { /* if conf dir specified */
917 cdir
= as
->parms
[12].items
->data
;
918 if (as
->parms
[13].items
|| as
->parms
[14].items
|| as
->parms
[15].items
) {
919 printf("Can't specify conf dir and other cell parameters\n");
920 return AFSCONF_SYNTAX
;
924 /* if we need to default cell name or cell servers, get local conf info */
926 if (!(local_conf
= afsconf_Open(AFSDIR_CLIENT_ETC_DIRPATH
))
927 && !(local_conf
= afsconf_Open(AFSDIR_SERVER_ETC_DIRPATH
))) {
928 printf("** Can't local configuration!\n");
929 return AFSCONF_NOCELL
;
932 if (as
->parms
[13].items
) { /* if cell name specified */
933 lcstring(lcell
, as
->parms
[13].items
->data
, sizeof(lcell
));
934 code
= afsconf_GetCellInfo(local_conf
, lcell
, 0, &cellinfo
);
936 strncpy(lcell
, cellinfo
.name
, sizeof(lcell
));
938 code
= afsconf_GetLocalCell(local_conf
, lcell
, sizeof(lcell
));
943 if (as
->parms
[14].items
) { /* noauth flag */
947 if (as
->parms
[15].items
) { /* servers list */
948 serverList
= as
->parms
[15].items
;
949 for (i
= 0; serverList
; i
++, serverList
= serverList
->next
) {
951 if (i
>= MAXHOSTSPERCELL
)
953 strncpy(cellinfo
.hostName
[i
], serverList
->data
, MAXHOSTCHARS
);
954 th
= gethostbyname(cellinfo
.hostName
[i
]);
957 memcpy(&cellinfo
.hostAddr
[i
].sin_addr
, th
->h_addr
,
959 cellinfo
.hostAddr
[i
].sin_family
= AF_INET
;
960 cellinfo
.hostAddr
[i
].sin_port
= 0;
961 #ifdef STRUCT_SOCKADDR_HAS_SA_LEN
962 cellinfo
.hostAddr
[i
].sin_len
= sizeof(struct sockaddr_in
);
965 cellinfo
.numServers
= i
;
966 strcpy(cellinfo
.name
, lcell
);
968 code
= afsconf_GetCellInfo(local_conf
, lcell
, 0, &cellinfo
);
974 afsconf_Close(local_conf
);
979 sprintf(tmp_conf_dir
, "%s/afsconf.%lu", gettmpdir(),
980 (unsigned long)getpid());
981 code
= mkdir(tmp_conf_dir
, 0777);
982 if ((code
< 0) && (errno
!= EEXIST
)) {
983 afs_com_err(whoami
, errno
, "can't create temporary afsconf dir: %s",
988 strcompose(tmp_conf_file
, 128, tmp_conf_dir
, "/",
989 AFSDIR_CELLSERVDB_FILE
, (char *)NULL
);
990 f
= fopen(tmp_conf_file
, "w");
993 afs_com_err(whoami
, errno
, "can't create conf file %s",
997 fprintf(f
, ">%s\n", lcell
);
998 for (i
= 0; i
< cellinfo
.numServers
; i
++) {
1000 (unsigned char *)&cellinfo
.hostAddr
[i
].sin_addr
;
1001 fprintf(f
, "%d.%d.%d.%d\t#%s\n", tp
[0], tp
[1], tp
[2], tp
[3],
1002 cellinfo
.hostName
[i
]);
1004 if (fclose(f
) == EOF
) {
1006 afs_com_err(whoami
, errno
, "can't write to conf file %s",
1011 strcompose(tmp_cell_file
, 128, tmp_conf_dir
, "/",
1012 AFSDIR_THISCELL_FILE
, (char *)NULL
);
1013 f
= fopen(tmp_cell_file
, "w");
1016 fprintf(f
, "%s", lcell
);
1017 if (fclose(f
) == EOF
)
1020 strcompose(tmp_noauth_file
, 128, tmp_conf_dir
, "/",
1021 AFSDIR_NOAUTH_FILE
, (char *)NULL
);
1023 code
= creat(tmp_noauth_file
, 0777);
1024 if (code
&& (errno
!= EEXIST
))
1026 } else { /* make sure file doesn't exist */
1027 code
= unlink(tmp_noauth_file
);
1028 if (code
&& (errno
!= ENOENT
))
1033 strncpy(conf_dir
, tmp_conf_dir
, sizeof(conf_dir
));
1034 conf
= afsconf_Open(conf_dir
);
1036 return AFSCONF_NOTFOUND
;
1041 add_std_args(struct cmd_syndesc
*ts
)
1044 cmd_AddParm(ts
, "-confdir", CMD_SINGLE
, CMD_OPTIONAL
,
1045 "AFS Conf dir pathname");
1046 cmd_AddParm(ts
, "-cell", CMD_SINGLE
, CMD_OPTIONAL
, "Cell name");
1047 cmd_AddParm(ts
, "-noauth", CMD_FLAG
, CMD_OPTIONAL
, "Don't authenticate");
1048 cmd_AddParm(ts
, "-servers", CMD_LIST
, CMD_OPTIONAL
, "Server config");
1054 /* OK, this REALLY sucks bigtime, but I can't tell who is calling
1055 * afsconf_CheckAuth easily, and only *SERVERS* should be calling osi_audit
1056 * anyway. It's gonna give somebody fits to debug, I know, I know.
1061 #include "AFS_component_version_number.c"
1064 main(int argc
, char *argv
[])
1067 struct cmd_syndesc
*ts
; /* ptr to parsed command line syntax */
1070 initialize_CMD_error_table();
1071 initialize_ACFG_error_table();
1072 initialize_KTC_error_table();
1073 initialize_U_error_table();
1074 initialize_PT_error_table();
1075 initialize_RXK_error_table();
1078 /* initialize winsock */
1079 if (afs_winsockInit() < 0) {
1080 fprintf(stderr
, "%s: couldn't initialize winsock. \n", whoami
);
1085 cmd_SetBeforeProc(MyBeforeProc
, NULL
);
1086 cmd_SetAfterProc(MyAfterProc
, NULL
);
1088 ts
= cmd_CreateSyntax("usedIds", ListUsedIds
, NULL
, 0,
1089 "Find used (or unused) user (or group) ids");
1090 cmd_AddParm(ts
, "-startId", CMD_SINGLE
, CMD_OPTIONAL
,
1091 "id to start checking");
1092 cmd_AddParm(ts
, "-number", CMD_SINGLE
, CMD_OPTIONAL
,
1093 "number of ids to check");
1094 cmd_AddParm(ts
, "-unused", CMD_FLAG
, CMD_OPTIONAL
, "print unused ids");
1097 ts
= cmd_CreateSyntax("initcmd", TestPrServ
, NULL
, 0, "test the prserver");
1100 ts
= cmd_CreateSyntax("testmanymembers", TestManyMembers
, NULL
, 0,
1101 "test creating users and groups w/ many members");
1102 cmd_AddParm(ts
, "-number", CMD_SINGLE
, 0,
1103 "number of users/groups to create");
1104 cmd_AddParm(ts
, "-dropoff", CMD_SINGLE
, CMD_OPTIONAL
,
1105 "precentage for exponential dropoff");
1106 cmd_AddParm(ts
, "-prefix", CMD_SINGLE
, CMD_OPTIONAL
, "naming prefix");
1107 cmd_AddParm(ts
, "-long", CMD_FLAG
, CMD_OPTIONAL
, "show progress");
1108 cmd_AddParm(ts
, "-seed", CMD_SINGLE
, CMD_OPTIONAL
, "random number seed");
1110 cmd_CreateAlias(ts
, "mm");
1113 code
= cmd_Dispatch(argc
, argv
);
1115 afs_com_err(whoami
, code
, "calling cmd_Dispatch");