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 <sys/types.h>
25 #include <WINNT/afsevent.h>
26 #include <WINNT/afsreg.h>
28 #include <netinet/in.h>
30 #include <afs/cellconfig.h>
36 #include "ptprototypes.h"
37 #include <afs/afsutil.h>
38 #include <afs/com_err.h>
47 extern struct ubik_client
*pruclient
;
50 struct sourcestack
*s_next
;
57 char cell
[MAXCELLCHARS
];
60 static int CleanUp(struct cmd_syndesc
*as
, void *arock
);
63 pts_Interactive(struct cmd_syndesc
*as
, void *arock
)
71 pts_Quit(struct cmd_syndesc
*as
, void *arock
)
78 pts_Source(struct cmd_syndesc
*as
, void *arock
)
81 struct sourcestack
*sp
;
84 if (!as
->parms
[0].items
) {
85 /* can this happen? */
88 fd
= fopen(as
->parms
[0].items
->data
, "r");
90 perror(as
->parms
[0].items
->data
);
93 sp
= (struct sourcestack
*)malloc(sizeof *sp
);
95 return errno
? errno
: ENOMEM
;
106 pts_Sleep(struct cmd_syndesc
*as
, void *arock
)
109 if (!as
->parms
[0].items
) {
110 /* can this happen? */
113 delay
= atoi(as
->parms
[0].items
->data
);
114 #ifdef AFS_PTHREAD_ENV
125 struct sourcestack
*sp
;
139 /* OK, this REALLY sucks bigtime, but I can't tell who is calling
140 * afsconf_CheckAuth easily, and only *SERVERS* should be calling osi_audit
141 * anyway. It's gonna give somebody fits to debug, I know, I know.
148 win32_enableCrypt(void)
155 /* Look up configuration parameters in Registry */
156 code
= RegOpenKeyEx(HKEY_LOCAL_MACHINE
, AFSREG_CLT_SVC_PARAM_SUBKEY
,
157 0, (IsWow64()?KEY_WOW64_64KEY
:0)|KEY_QUERY_VALUE
, &parmKey
);
158 if (code
!= ERROR_SUCCESS
) {
159 dummyLen
= sizeof(cryptall
);
160 RegQueryValueEx(parmKey
, "SecurityLevel", NULL
, NULL
,
161 (BYTE
*) &cryptall
, &dummyLen
);
163 RegCloseKey (parmKey
);
167 #endif /* AFS_NT40_ENV */
170 GetGlobals(struct cmd_syndesc
*as
, void *arock
)
172 struct authstate
*state
= (struct authstate
*) arock
;
181 if (!strcmp(as
->name
, "help"))
189 if (state
->confdir
== NULL
) {
193 if (as
->parms
[16].items
) {
195 cell
= as
->parms
[16].items
->data
;
197 if (as
->parms
[17].items
) { /* -noauth */
201 if (as
->parms
[20].items
) { /* -localauth */
205 if (as
->parms
[21].items
) { /* -auth */
209 if (as
->parms
[22].items
/* -encrypt */
211 || win32_enableCrypt()
212 #endif /* AFS_NT40_ENV */
217 if (as
->parms
[18].items
|| as
->parms
[20].items
) { /* -test, -localauth */
219 confdir
= AFSDIR_SERVER_ETC_DIRPATH
;
222 confdir
= AFSDIR_SERVER_ETC_DIRPATH
;
224 confdir
= AFSDIR_CLIENT_ETC_DIRPATH
;
228 code
= pr_Initialize(sec
, confdir
, cell
);
233 afs_com_err(whoami
, code
, "while initializing");
237 state
->confdir
= confdir
;
238 if (cell
&& cell
!= state
->cell
)
239 strncpy(state
->cell
, cell
, MAXCELLCHARS
-1);
242 if (as
->parms
[19].items
)
249 CleanUp(struct cmd_syndesc
*as
, void *arock
)
251 if (as
&& !strcmp(as
->name
, "help"))
254 /* Need to shutdown the ubik_client & other connections */
262 CreateGroup(struct cmd_syndesc
*as
, void *arock
)
267 struct cmd_item
*namei
;
268 struct cmd_item
*idi
;
270 namei
= as
->parms
[0].items
;
271 idi
= as
->parms
[2].items
;
272 if (as
->parms
[1].items
)
273 owner
= as
->parms
[1].items
->data
;
279 code
= util_GetInt32(idi
->data
, &id
);
281 afs_com_err(whoami
, code
, "because group id was: '%s'",
286 printf("0 isn't a valid group id; aborting\n");
291 afs_com_err(whoami
, code
, "because group id %d was not negative",
300 code
= pr_CreateGroup(namei
->data
, owner
, &id
);
303 afs_com_err(whoami
, code
,
304 "; unable to create group %s with id %d%s%s%s%s",
305 namei
->data
, id
, owner
? " owned by '" : "",
306 owner
? owner
: "", owner
? "'" : "",
307 (force
? " (ignored)" : ""));
309 afs_com_err(whoami
, code
, "; unable to create group %s %s",
310 namei
->data
, (force
? "(ignored)" : ""));
314 printf("group %s has id %d\n", namei
->data
, id
);
321 CreateUser(struct cmd_syndesc
*as
, void *arock
)
325 struct cmd_item
*namei
;
326 struct cmd_item
*idi
;
328 namei
= as
->parms
[0].items
;
329 idi
= as
->parms
[1].items
;
333 code
= util_GetInt32(idi
->data
, &id
);
335 afs_com_err(whoami
, code
, "because id was: '%s'", idi
->data
);
339 printf("0 isn't a valid user id; aborting\n");
344 afs_com_err(whoami
, code
, "because user id %d was not positive",
352 code
= pr_CreateUser(namei
->data
, &id
);
355 afs_com_err(whoami
, code
,
356 "; unable to create user %s with id %d %s",
357 namei
->data
, id
, (force
? "(ignored)" : ""));
359 afs_com_err(whoami
, code
, "; unable to create user %s %s",
360 namei
->data
, (force
? "(ignored)" : ""));
364 printf("User %s has id %d\n", namei
->data
, id
);
373 GetNameOrId(struct cmd_syndesc
*as
, struct idlist
*lids
, struct namelist
*lnames
)
380 if (!(as
->parms
[0].items
|| as
->parms
[1].items
)) {
381 afs_com_err(whoami
, 0, "must specify either a name or an id.");
384 if (as
->parms
[0].items
&& as
->parms
[1].items
) {
385 afs_com_err(whoami
, 0, "can't specify both a name and id.");
390 lids
->idlist_len
= 0;
391 lids
->idlist_val
= 0;
393 if (as
->parms
[0].items
) { /* name */
394 struct namelist names
; /* local copy, if not ret. names */
397 names
.namelist_val
= 0; /* so it gets freed later if needed */
403 n
= 0; /* count names */
404 for (i
= as
->parms
[0].items
; i
; i
= i
->next
)
406 nl
->namelist_val
= (prname
*) malloc(n
* PR_MAXNAMELEN
);
407 nl
->namelist_len
= n
;
409 for (i
= as
->parms
[0].items
; i
; i
= i
->next
)
410 strncpy(nl
->namelist_val
[n
++], i
->data
, PR_MAXNAMELEN
);
412 code
= pr_NameToId(nl
, lids
);
414 afs_com_err(whoami
, code
, "so couldn't look up names");
416 for (n
= 0; n
< lids
->idlist_len
; n
++) {
417 if ((lids
->idlist_val
[n
] == ANONYMOUSID
)) {
418 afs_com_err(whoami
, PRNOENT
, "so couldn't look up id for %s",
419 nl
->namelist_val
[n
]);
423 /* treat things as working if any of the lookups worked */
428 if (names
.namelist_val
)
429 free(names
.namelist_val
);
430 } else if (as
->parms
[1].items
) { /* id */
432 for (i
= as
->parms
[1].items
; i
; i
= i
->next
)
434 lids
->idlist_val
= (afs_int32
*) malloc(n
* sizeof(afs_int32
));
435 lids
->idlist_len
= n
;
437 for (i
= as
->parms
[1].items
; i
; i
= i
->next
) {
438 code
= util_GetInt32(i
->data
, &lids
->idlist_val
[n
]);
440 afs_com_err(whoami
, code
=
441 PRNOENT
, "because a bogus id '%s' was specified",
445 if (!code
&& lnames
) {
446 lnames
->namelist_val
= 0;
447 lnames
->namelist_len
= 0;
448 code
= pr_IdToName(lids
, lnames
);
450 afs_com_err(whoami
, code
, "translating ids");
454 if (lids
->idlist_val
)
455 free(lids
->idlist_val
);
464 GetNameOrId(struct cmd_syndesc
*as
, struct idlist
*lids
,
465 struct namelist
*lnames
)
468 int n
= 0, nd
= 0, nm
= 0, id
, x
;
470 struct namelist names
, tnames
; /* local copy, if not ret. names */
471 struct idlist ids
, tids
; /* local copy, if not ret. ids */
474 for (i
= as
->parms
[0].items
; i
; i
= i
->next
)
476 lids
->idlist_val
= (afs_int32
*) malloc(n
* sizeof(afs_int32
));
477 lids
->idlist_len
= n
;
478 ids
.idlist_val
= (afs_int32
*) malloc(n
* sizeof(afs_int32
));
480 names
.namelist_val
= (prname
*) malloc(n
* PR_MAXNAMELEN
);
481 names
.namelist_len
= n
;
483 lnames
->namelist_val
= (prname
*) malloc(n
* PR_MAXNAMELEN
);
484 lnames
->namelist_len
= 0;
486 for (i
= as
->parms
[0].items
; i
; i
= i
->next
) {
487 tnames
.namelist_val
= (prname
*) malloc(PR_MAXNAMELEN
);
488 strncpy(tnames
.namelist_val
[0], i
->data
, PR_MAXNAMELEN
);
489 tnames
.namelist_len
= 1;
492 code
= pr_NameToId(&tnames
, &tids
);
493 if ((!code
&& (tids
.idlist_val
[0] != 32766))
494 || (code
= util_GetInt32(i
->data
, &id
))) {
495 /* Assume it's a name instead */
496 strncpy(names
.namelist_val
[nm
++], i
->data
, PR_MAXNAMELEN
);
498 ids
.idlist_val
[nd
++] = id
;
500 free(tnames
.namelist_val
);
502 names
.namelist_len
= nm
;
504 tids
.idlist_len
= nd
= nm
= 0;
506 code
= pr_NameToId(&names
, &tids
);
508 afs_com_err(whoami
, code
, "so couldn't look up names");
510 for (n
= 0; n
< tids
.idlist_len
; n
++) {
511 if (tids
.idlist_val
[n
] == ANONYMOUSID
) {
512 afs_com_err(whoami
, PRNOENT
, "so couldn't look up id for %s",
513 names
.namelist_val
[n
]);
516 lids
->idlist_val
[nd
] = tids
.idlist_val
[n
];
518 strcpy(lnames
->namelist_val
[nd
], names
.namelist_val
[n
]);
522 for (x
= 0; x
< ids
.idlist_len
; x
++) {
523 lids
->idlist_val
[nd
+ x
] = ids
.idlist_val
[x
];
525 lids
->idlist_len
= nd
+ x
;
526 if (!code
&& lnames
) {
527 tnames
.namelist_val
= 0;
528 tnames
.namelist_len
= 0;
529 code
= pr_IdToName(&ids
, &tnames
);
531 afs_com_err(whoami
, code
, "translating ids");
535 for (x
= 0; x
< ids
.idlist_len
; x
++)
536 strcpy(lnames
->namelist_val
[nd
+ x
], tnames
.namelist_val
[x
]);
537 lnames
->namelist_len
= nd
+ x
;
540 /* treat things as working if any of the lookups worked */
544 if (lids
->idlist_val
)
545 free(lids
->idlist_val
);
553 AddToGroup(struct cmd_syndesc
*as
, void *arock
)
556 struct cmd_item
*u
, *g
;
558 for (u
= as
->parms
[0].items
; u
; u
= u
->next
) {
559 for (g
= as
->parms
[1].items
; g
; g
= g
->next
) {
560 code
= pr_AddToGroup(u
->data
, g
->data
);
562 afs_com_err(whoami
, code
,
563 "; unable to add user %s to group %s %s", u
->data
,
564 g
->data
, (force
? "(ignored)" : ""));
574 RemoveFromGroup(struct cmd_syndesc
*as
, void *arock
)
577 struct cmd_item
*u
, *g
;
579 for (u
= as
->parms
[0].items
; u
; u
= u
->next
) {
580 for (g
= as
->parms
[1].items
; g
; g
= g
->next
) {
581 code
= pr_RemoveUserFromGroup(u
->data
, g
->data
);
583 afs_com_err(whoami
, code
,
584 "; unable to remove user %s from group %s %s",
585 u
->data
, g
->data
, (force
? "(ignored)" : ""));
595 ListMembership(struct cmd_syndesc
*as
, void *arock
)
604 if (GetNameOrId(as
, &ids
, &names
))
607 for (i
= 0; i
< ids
.idlist_len
; i
++) {
608 afs_int32 id
= ids
.idlist_val
[i
];
609 char *name
= names
.namelist_val
[i
];
611 if (id
== ANONYMOUSID
)
612 continue; /* bad entry */
614 list
.namelist_val
= 0;
615 list
.namelist_len
= 0;
616 if (as
->parms
[2].items
) { /* -expandgroups */
617 code
= pr_IDListExpandedMembers(id
, &list
);
621 code
= pr_IDListMembers(id
, &list
);
624 afs_com_err(whoami
, code
, "; unable to get membership of %s (id: %d)",
629 printf("Members of %s (id: %d) are:\n", name
, id
);
631 printf("Groups %s (id: %d) is a member of:\n", name
, id
);
633 for (j
= 0; j
< list
.namelist_len
; j
++)
634 printf(" %s\n", list
.namelist_val
[j
]);
635 if (list
.namelist_val
)
636 free(list
.namelist_val
);
637 if (as
->parms
[1].items
&& id
< 0) { /* -supergroups */
638 list
.namelist_val
= 0;
639 list
.namelist_len
= 0;
640 code
= pr_ListSuperGroups(ids
.idlist_val
[i
], &list
);
641 if (code
== RXGEN_OPCODE
) {
642 continue; /* server does not support supergroups */
643 } else if (code
!= 0) {
644 afs_com_err(whoami
, code
,
645 "; unable to get supergroups of %s (id: %d)",
649 printf("Groups %s (id: %d) is a member of:\n", name
, id
);
650 for (j
= 0; j
< list
.namelist_len
; j
++)
651 printf(" %s\n", list
.namelist_val
[j
]);
652 if (list
.namelist_val
)
653 free(list
.namelist_val
);
657 free(ids
.idlist_val
);
658 if (names
.namelist_val
)
659 free(names
.namelist_val
);
664 Delete(struct cmd_syndesc
*as
, void *arock
)
671 if (GetNameOrId(as
, &ids
, &names
))
674 for (i
= 0; i
< ids
.idlist_len
; i
++) {
675 afs_int32 id
= ids
.idlist_val
[i
];
676 char *name
= names
.namelist_val
[i
];
678 if (id
== ANONYMOUSID
)
681 code
= pr_DeleteByID(id
);
683 afs_com_err(whoami
, code
, "deleting %s (id: %d) %s", name
, id
,
684 (force
? "(ignored)" : ""));
690 free(ids
.idlist_val
);
691 if (names
.namelist_val
)
692 free(names
.namelist_val
);
696 /* access bit translation info */
698 char *flags_upcase
= "SOMA "; /* legal all access values */
699 char *flags_dncase
= "s mar"; /* legal member acces values */
700 int flags_shift
[5] = { 2, 1, 2, 2, 1 }; /* bits for each */
703 CheckEntry(struct cmd_syndesc
*as
, void *arock
)
707 int i
, flag
= 0, admin
= 0;
708 namelist lnames
, names
;
711 struct prcheckentry aentry
;
713 if (GetNameOrId(as
, &ids
, &names
))
717 lids
.idlist_val
= (afs_int32
*) malloc(sizeof(afs_int32
) * 2);
718 lnames
.namelist_len
= 0;
719 lnames
.namelist_val
= 0;
721 for (i
= 0; i
< ids
.idlist_len
; i
++) {
722 afs_int32 id
= ids
.idlist_val
[i
];
724 if (id
== ANONYMOUSID
)
728 code
= pr_ListEntry(id
, &aentry
);
731 afs_com_err(whoami
, code
, "; unable to find entry for (id: %d)", id
);
735 lids
.idlist_val
[0] = aentry
.owner
;
736 lids
.idlist_val
[1] = aentry
.creator
;
737 code
= pr_IdToName(&lids
, &lnames
);
740 afs_com_err(whoami
, code
,
741 "translating owner (%d) and creator (%d) ids",
742 aentry
.owner
, aentry
.creator
);
745 printf("Name: %s, id: %d, owner: %s, creator: %s,\n", aentry
.name
,
746 aentry
.id
, lnames
.namelist_val
[0], lnames
.namelist_val
[1]);
747 printf(" membership: %d", aentry
.count
);
750 afs_int32 flags
= aentry
.flags
;
753 access
[5] = 0; /* null-terminate the string */
754 for (j
= 4; j
>= 0; j
--) {
773 printf(", flags: %s", access
);
775 if (aentry
.id
== SYSADMINID
)
777 else if (!pr_IsAMemberOf(aentry
.name
, "system:administrators", &flag
)) {
782 printf(", group quota: unlimited");
784 printf(", group quota: %d", aentry
.ngroups
);
786 printf(", foreign user quota=%d", aentry
.nusers
);
791 if (lnames
.namelist_val
)
792 free(lnames
.namelist_val
);
794 free(lids
.idlist_val
);
796 free(ids
.idlist_val
);
802 ListEntries(struct cmd_syndesc
*as
, void *arock
)
805 afs_int32 flag
, startindex
, nentries
, nextstartindex
;
806 struct prlistentries
*entriesp
= 0, *e
;
810 if (as
->parms
[1].items
)
812 if (as
->parms
[0].items
)
815 printf("Name ID Owner Creator\n");
816 for (startindex
= 0; startindex
!= -1; startindex
= nextstartindex
) {
818 pr_ListEntries(flag
, startindex
, &nentries
, &entriesp
,
821 afs_com_err(whoami
, code
, "; unable to list entries");
827 /* Now display each of the entries we read */
828 for (i
= 0, e
= entriesp
; i
< nentries
; i
++, e
++) {
829 printf("%-25s %6d %6d %7d \n", e
->name
, e
->id
, e
->owner
,
839 ChownGroup(struct cmd_syndesc
*as
, void *arock
)
845 name
= as
->parms
[0].items
->data
;
846 owner
= as
->parms
[1].items
->data
;
847 code
= pr_ChangeEntry(name
, "", 0, owner
);
849 afs_com_err(whoami
, code
, "; unable to change owner of %s to %s", name
,
855 ChangeName(struct cmd_syndesc
*as
, void *arock
)
861 oldname
= as
->parms
[0].items
->data
;
862 newname
= as
->parms
[1].items
->data
;
863 code
= pr_ChangeEntry(oldname
, newname
, 0, "");
865 afs_com_err(whoami
, code
, "; unable to change name of %s to %s", oldname
,
871 ListMax(struct cmd_syndesc
*as
, void *arock
)
874 afs_int32 maxUser
, maxGroup
;
876 code
= pr_ListMaxUserId(&maxUser
);
878 afs_com_err(whoami
, code
, "getting maximum user id");
880 code
= pr_ListMaxGroupId(&maxGroup
);
882 afs_com_err(whoami
, code
, "getting maximum group id");
884 printf("Max user id is %d and max group id is %d.\n", maxUser
,
892 SetMaxCommand(struct cmd_syndesc
*as
, void *arock
)
898 if (as
->parms
[1].items
) {
900 code
= util_GetInt32(as
->parms
[1].items
->data
, &maxid
);
902 afs_com_err(whoami
, code
, "because id was: '%s'",
903 as
->parms
[1].items
->data
);
905 code
= pr_SetMaxUserId(maxid
);
907 afs_com_err(whoami
, code
, "so couldn't set Max User Id to %d",
911 if (as
->parms
[0].items
) {
913 code
= util_GetInt32(as
->parms
[0].items
->data
, &maxid
);
915 afs_com_err(whoami
, code
, "because id was: '%s'",
916 as
->parms
[0].items
->data
);
918 code
= pr_SetMaxGroupId(maxid
);
920 afs_com_err(whoami
, code
, "so couldn't set Max Group Id to %d",
924 if (!as
->parms
[0].items
&& !as
->parms
[1].items
) {
926 printf("Must specify at least one of group or user.\n");
932 SetFields(struct cmd_syndesc
*as
, void *arock
)
938 afs_int32 mask
, flags
=0, ngroups
, nusers
;
940 if (GetNameOrId(as
, &ids
, &names
))
947 if (as
->parms
[1].items
) { /* privacy bits */
948 char *access
= as
->parms
[1].items
->data
;
951 if (strpbrk(access
, "76543210") != 0) { /* all octal digits */
952 sscanf(access
, "%lo", (long unsigned int *) &flags
);
953 } else { /* interpret flag bit names */
954 if (strlen(access
) != 5) {
956 printf("Access bits must be of the form 'somar', not %s\n",
960 if (strpbrk(access
, "somar-") == 0)
963 for (i
= 0; i
< 5; i
++) {
964 if (access
[i
] == flags_upcase
[i
])
966 else if (access
[i
] == flags_dncase
[i
])
968 else if (access
[i
] == '-')
972 ("Access bits out of order or illegal:\n must be a combination of letters from '%s' or '%s' or hyphen, not %s\n",
973 flags_upcase
, flags_dncase
, access
);
976 flags
<<= flags_shift
[i
];
977 if (flags_shift
[i
] == 1) {
984 mask
|= PR_SF_ALLBITS
;
986 if (as
->parms
[2].items
) { /* limitgroups */
987 code
= util_GetInt32(as
->parms
[2].items
->data
, &ngroups
);
989 afs_com_err(whoami
, code
, "because ngroups was: '%s'",
990 as
->parms
[2].items
->data
);
993 mask
|= PR_SF_NGROUPS
;
996 if (as
->parms
[3].items
) { /* limitgroups */
997 code
= util_GetInt32(as
->parms
[3].items
->data
, &nusers
);
999 afs_com_err(whoami
, code
, "because nusers was: '%s'",
1000 as
->parms
[3].items
->data
);
1003 mask
|= PR_SF_NUSERS
;
1007 for (i
= 0; i
< ids
.idlist_len
; i
++) {
1008 afs_int32 id
= ids
.idlist_val
[i
];
1009 char *name
= names
.namelist_val
[i
];
1010 if (id
== ANONYMOUSID
)
1012 code
= pr_SetFieldsEntry(id
, mask
, flags
, ngroups
, nusers
);
1014 afs_com_err(whoami
, code
, "; unable to set fields for %s (id: %d)",
1020 free(ids
.idlist_val
);
1021 if (names
.namelist_val
)
1022 free(names
.namelist_val
);
1027 ListOwned(struct cmd_syndesc
*as
, void *arock
)
1036 if (GetNameOrId(as
, &ids
, &names
))
1039 for (i
= 0; i
< ids
.idlist_len
; i
++) {
1040 afs_int32 oid
= ids
.idlist_val
[i
];
1041 char *name
= names
.namelist_val
[i
];
1043 if (oid
== ANONYMOUSID
)
1047 printf("Groups owned by %s (id: %d) are:\n", name
, oid
);
1049 printf("Orphaned groups are:\n");
1052 list
.namelist_val
= 0;
1053 list
.namelist_len
= 0;
1054 code
= pr_ListOwned(oid
, &list
, &more
);
1056 afs_com_err(whoami
, code
,
1057 "; unable to get owner list for %s (id: %d)", name
,
1062 for (j
= 0; j
< list
.namelist_len
; j
++)
1063 printf(" %s\n", list
.namelist_val
[j
]);
1064 if (list
.namelist_val
)
1065 free(list
.namelist_val
);
1070 free(ids
.idlist_val
);
1071 if (names
.namelist_val
)
1072 free(names
.namelist_val
);
1077 add_std_args(struct cmd_syndesc
*ts
)
1079 char test_help
[AFSDIR_PATH_MAX
];
1081 sprintf(test_help
, "use config file in %s", AFSDIR_SERVER_ETC_DIRPATH
);
1084 cmd_AddParm(ts
, "-cell", CMD_SINGLE
, CMD_OPTIONAL
, "cell name");
1085 cmd_AddParm(ts
, "-noauth", CMD_FLAG
, CMD_OPTIONAL
, "run unauthenticated");
1086 cmd_AddParm(ts
, "-test", CMD_FLAG
, CMD_OPTIONAL
| CMD_HIDE
, test_help
);
1087 cmd_AddParm(ts
, "-force", CMD_FLAG
, CMD_OPTIONAL
,
1088 "Continue oper despite reasonable errors");
1089 cmd_AddParm(ts
, "-localauth", CMD_FLAG
, CMD_OPTIONAL
,
1090 "use local authentication");
1091 cmd_AddParm(ts
, "-auth", CMD_FLAG
, CMD_OPTIONAL
,
1092 "use user's authentication (default)");
1093 cmd_AddParm(ts
, "-encrypt", CMD_FLAG
, CMD_OPTIONAL
,
1094 "encrypt commands");
1098 static void add_NameOrId_args (ts)
1099 struct cmd_syndesc *ts;
1101 cmd_AddParm(ts,"-name",CMD_LIST,CMD_OPTIONAL,"user or group name");
1102 cmd_AddParm(ts,"-id",CMD_LIST,CMD_OPTIONAL,"user or group id");
1106 #include "AFS_component_version_number.c"
1109 main(int argc
, char **argv
)
1112 struct cmd_syndesc
*ts
;
1117 char *parsev
[CMD_MAXPARMS
];
1119 struct authstate state
;
1126 WSAStartup(0x0101, &WSAjunk
);
1129 #ifdef AFS_AIX32_ENV
1131 * The following signal action for AIX is necessary so that in case of a
1132 * crash (i.e. core is generated) we can include the user's data section
1133 * in the core dump. Unfortunately, by default, only a partial core is
1134 * generated which, in many cases, isn't too useful.
1136 struct sigaction nsa
;
1138 sigemptyset(&nsa
.sa_mask
);
1139 nsa
.sa_handler
= SIG_DFL
;
1140 nsa
.sa_flags
= SA_FULLDUMP
;
1141 sigaction(SIGSEGV
, &nsa
, NULL
);
1144 memset(&state
, 0, sizeof(state
));
1145 state
.sec
= 1; /* default is auth */
1147 ts
= cmd_CreateSyntax("creategroup", CreateGroup
, NULL
,
1148 "create a new group");
1149 cmd_AddParm(ts
, "-name", CMD_LIST
, 0, "group name");
1150 cmd_AddParm(ts
, "-owner", CMD_SINGLE
, CMD_OPTIONAL
, "owner of the group");
1151 cmd_AddParm(ts
, "-id", CMD_LIST
, CMD_OPTIONAL
,
1152 "id (negated) for the group");
1154 cmd_CreateAlias(ts
, "cg");
1156 ts
= cmd_CreateSyntax("createuser", CreateUser
, NULL
, "create a new user");
1157 cmd_AddParm(ts
, "-name", CMD_LIST
, 0, "user name");
1158 cmd_AddParm(ts
, "-id", CMD_LIST
, CMD_OPTIONAL
, "user id");
1160 cmd_CreateAlias(ts
, "cu");
1162 ts
= cmd_CreateSyntax("adduser", AddToGroup
, NULL
, "add a user to a group");
1163 cmd_AddParm(ts
, "-user", CMD_LIST
, 0, "user name");
1164 cmd_AddParm(ts
, "-group", CMD_LIST
, 0, "group name");
1167 ts
= cmd_CreateSyntax("removeuser", RemoveFromGroup
, NULL
,
1168 "remove a user from a group");
1169 cmd_AddParm(ts
, "-user", CMD_LIST
, 0, "user name");
1170 cmd_AddParm(ts
, "-group", CMD_LIST
, 0, "group name");
1173 ts
= cmd_CreateSyntax("membership", ListMembership
, NULL
,
1174 "list membership of a user or group");
1175 cmd_AddParm(ts
, "-nameorid", CMD_LIST
, 0, "user or group name or id");
1176 cmd_AddParm(ts
, "-supergroups", CMD_FLAG
, CMD_OPTIONAL
, "show supergroups");
1177 cmd_AddParm(ts
, "-expandgroups", CMD_FLAG
, CMD_OPTIONAL
, "expand super and sub group membership");
1179 cmd_CreateAlias(ts
, "groups");
1181 ts
= cmd_CreateSyntax("delete", Delete
, NULL
,
1182 "delete a user or group from database");
1183 cmd_AddParm(ts
, "-nameorid", CMD_LIST
, 0, "user or group name or id");
1186 ts
= cmd_CreateSyntax("examine", CheckEntry
, NULL
, "examine an entry");
1187 cmd_AddParm(ts
, "-nameorid", CMD_LIST
, 0, "user or group name or id");
1189 cmd_CreateAlias(ts
, "check");
1191 ts
= cmd_CreateSyntax("chown", ChownGroup
, NULL
,
1192 "change ownership of a group");
1193 cmd_AddParm(ts
, "-name", CMD_SINGLE
, 0, "group name");
1194 cmd_AddParm(ts
, "-owner", CMD_SINGLE
, 0, "new owner");
1197 ts
= cmd_CreateSyntax("rename", ChangeName
, NULL
, "rename user or group");
1198 cmd_AddParm(ts
, "-oldname", CMD_SINGLE
, 0, "old name");
1199 cmd_AddParm(ts
, "-newname", CMD_SINGLE
, 0, "new name");
1201 cmd_CreateAlias(ts
, "chname");
1203 ts
= cmd_CreateSyntax("listmax", ListMax
, NULL
, "list max id");
1206 ts
= cmd_CreateSyntax("setmax", SetMaxCommand
, NULL
, "set max id");
1207 cmd_AddParm(ts
, "-group", CMD_SINGLE
, CMD_OPTIONAL
, "group max");
1208 cmd_AddParm(ts
, "-user", CMD_SINGLE
, CMD_OPTIONAL
, "user max");
1211 ts
= cmd_CreateSyntax("setfields", SetFields
, NULL
,
1212 "set fields for an entry");
1213 cmd_AddParm(ts
, "-nameorid", CMD_LIST
, 0, "user or group name or id");
1214 cmd_AddParm(ts
, "-access", CMD_SINGLE
, CMD_OPTIONAL
, "set privacy flags");
1215 cmd_AddParm(ts
, "-groupquota", CMD_SINGLE
, CMD_OPTIONAL
,
1216 "set limit on group creation");
1218 cmd_AddParm(ts
, "-userquota", CMD_SINGLE
, CMD_OPTIONAL
,
1219 "set limit on foreign user creation");
1223 ts
= cmd_CreateSyntax("listowned", ListOwned
, NULL
,
1224 "list groups owned by an entry or zero id gets orphaned groups");
1225 cmd_AddParm(ts
, "-nameorid", CMD_LIST
, 0, "user or group name or id");
1228 ts
= cmd_CreateSyntax("listentries", ListEntries
, NULL
,
1229 "list users/groups in the protection database");
1230 cmd_AddParm(ts
, "-users", CMD_FLAG
, CMD_OPTIONAL
, "list user entries");
1231 cmd_AddParm(ts
, "-groups", CMD_FLAG
, CMD_OPTIONAL
, "list group entries");
1234 ts
= cmd_CreateSyntax("interactive", pts_Interactive
, NULL
,
1235 "enter interactive mode");
1237 cmd_CreateAlias(ts
, "in");
1239 ts
= cmd_CreateSyntax("quit", pts_Quit
, NULL
, "exit program");
1242 ts
= cmd_CreateSyntax("source", pts_Source
, NULL
, "read commands from file");
1243 cmd_AddParm(ts
, "-file", CMD_SINGLE
, 0, "filename");
1246 ts
= cmd_CreateSyntax("sleep", pts_Sleep
, NULL
, "pause for a bit");
1247 cmd_AddParm(ts
, "-delay", CMD_SINGLE
, 0, "seconds");
1250 cmd_SetBeforeProc(GetGlobals
, &state
);
1254 if ((code
= cmd_Dispatch(argc
, argv
))) {
1255 CleanUp(NULL
, NULL
);
1258 while (source
&& !finished
) {
1259 if (isatty(fileno(source
)))
1260 fprintf(stderr
, "pts> ");
1261 if (!fgets(line
, sizeof line
, source
)) {
1267 for (cp
= line
; *cp
; ++cp
)
1277 cmd_ParseLine(line
, parsev
, &parsec
,
1278 sizeof(parsev
) / sizeof(*parsev
));
1280 afs_com_err(whoami
, code
, "parsing line: <%s>", line
);
1284 parsev
[0] = argv
[0];
1285 code
= cmd_Dispatch(parsec
, parsev
);
1287 cmd_FreeArgv(parsev
);
1289 CleanUp(NULL
, NULL
);