4dc03873fdb04950411a1356adcf6562287e8b0f
[openafs.git] / src / ptserver / ptserver.h
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
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
8  */
9
10 #if defined(UKERNEL)
11 #include "afs/ptint.h"
12 #else /* defined(UKERNEL) */
13 #include "ptint.h"
14 #endif /* defined(UKERNEL) */
15
16 #define PRSRV           73
17
18 #define ENTRYSIZE       192
19 #define HASHSIZE        8191
20
21 #define PRBADID         0x80000000
22
23 #define SYSVIEWERID     -203
24 #define SYSADMINID      -204
25 #define SYSBACKUPID     -205
26 #define ANYUSERID       -101
27 #define AUTHUSERID      -102
28 #define ANONYMOUSID     32766
29
30 #define PRDBVERSION     0
31
32 struct prheader {
33     afs_int32 version;                  /* database version number */
34     afs_int32 headerSize;                       /* bytes in header (almost version#) */
35     afs_int32 freePtr;                  /* first free entry in freelist */
36     afs_int32 eofPtr;                   /* first free byte in file */
37     afs_int32 maxGroup;                 /* most negative group id */
38     afs_int32 maxID;                    /* largest user id allocated */
39     afs_int32 maxForeign;                       /* largest foreign id allocated*/
40     afs_int32 maxInst;                  /* largest sub/super id allocated */
41     afs_int32 orphan;                   /* groups owned by deleted users */
42     afs_int32 usercount;                        /* num users in system */
43     afs_int32 groupcount;                       /* num groups in system */
44     afs_int32 foreigncount;                     /* num registered foreign users NYI*/
45     afs_int32 instcount;                        /* number of sub and super users NYI */
46     afs_int32 reserved[5];                      /* just in case */
47     afs_int32 nameHash[HASHSIZE];               /* hash table for names */
48     afs_int32 idHash[HASHSIZE];         /* hash table for ids */
49 };
50
51 extern struct prheader cheader;
52
53 #define set_header_word(tt,field,value) \
54   pr_Write ((tt), 0, ((char *)&(cheader.field) - (char *)&cheader),   \
55             ((cheader.field = (value)), (char *)&(cheader.field)),    \
56             sizeof(afs_int32))
57
58 #define inc_header_word(tt,field,inc) \
59   pr_Write ((tt), 0, ((char *)&(cheader.field) - (char *)&cheader), \
60             ((cheader.field = (htonl(ntohl(cheader.field)+(inc)))),         \
61              (char *)&(cheader.field)),                             \
62             sizeof(afs_int32))
63
64 #define PRFREE          1               /* 1 if in free list */
65 #define PRGRP           2               /* 1 if a group entry */
66 #define PRCONT          4               /* 1 if an extension block */
67 #define PRCELL          8               /* 1 if cell entry */
68 #define PRFOREIGN       16              /* 1 if foreign user */
69 #define PRINST          32              /* 1 if sub/super instance */
70
71 #define PRTYPE          0x3f            /* type bits: only one should be set */
72 #define PRUSER          0               /* all type bits 0 => user entry */
73
74 #define PRACCESS        (1<<6)          /* access checking enabled */
75 #define PRQUOTA         (1<<7)          /* group creation quota checking on */
76
77 /* define the access bits for entries, they are stored in the left half of the
78  * entry's flags.  The SetFields interface takes them in the right half.  There
79  * are eight bits altogether defining access rights for status, owned, member,
80  * add, and remove operations.  For rights with two bits the values are defined
81  * to be o=00, m=01, a=10, with 11 reserved.  As implemented, however, it is
82  * o=00, m=01, a=1x. */
83 #define PRIVATE_SHIFT    16             /* move privacy bits to left half of flags */
84 #define PRP_STATUS_ANY (0x80 << PRIVATE_SHIFT)
85 #define PRP_STATUS_MEM (0x40 << PRIVATE_SHIFT)
86 #define PRP_OWNED_ANY  (0x20 << PRIVATE_SHIFT)
87 #define PRP_MEMBER_ANY (0x10 << PRIVATE_SHIFT)
88 #define PRP_MEMBER_MEM (0x08 << PRIVATE_SHIFT)
89 #define PRP_ADD_ANY    (0x04 << PRIVATE_SHIFT)
90 #define PRP_ADD_MEM    (0x02 << PRIVATE_SHIFT)
91 #define PRP_REMOVE_MEM (0x01 << PRIVATE_SHIFT)
92
93 #define PRP_GROUP_DEFAULT (PRP_STATUS_ANY | PRP_MEMBER_ANY)
94 #define PRP_USER_DEFAULT (PRP_STATUS_ANY)
95
96 #define PR_REMEMBER_TIMES 1
97
98 struct prentry {
99     afs_int32 flags;                            /* random flags */
100     afs_int32 id;                               /* user or group id*/
101     afs_int32 cellid;                   /* A foreign users's repsenting group */
102     afs_int32 next;                             /* next block same entry (or freelist) */
103 #ifdef PR_REMEMBER_TIMES
104     afs_uint32 createTime, addTime, removeTime, changeTime;
105     afs_int32 reserved[1];
106 #else
107     afs_int32 reserved[5];
108 #endif
109     afs_int32 entries[PRSIZE];          /* groups a user is a member of (or list of members */
110     afs_int32 nextID;                   /* id hash table next pointer */
111     afs_int32 nextName;                 /* name has table next ptr */
112     afs_int32 owner;                    /* id of owner of entry */
113     afs_int32 creator;                  /* may differ from owner */
114     afs_int32 ngroups;                  /* number of groups this user has created
115                                          * -- 0 for reg group entries
116                                          * -- number of foreign users if foreign group */
117     afs_int32 nusers;                   /* Users added to foreign group */
118     afs_int32 count;                            /* number of members/groups for this group/user */
119     afs_int32 instance;                 /* number of sub/super instances for this user NYI */
120     afs_int32 owned;                            /* chain of groups owned by this entry */
121     afs_int32 nextOwned;                        /* chain of groups for owner of this entry */
122     afs_int32 parent;                   /* ptr to super instance  NYI*/
123     afs_int32 sibling;                  /* ptr to sibling instance  NYI*/
124     afs_int32 child;                            /* ptr to first child  NYI*/
125     char name[PR_MAXNAMELEN];           /* user or group name */
126 };
127
128 struct contentry {                      /* continuation of entry */
129     afs_int32 flags;                
130     afs_int32 id;
131     afs_int32 cellid;
132     afs_int32 next;
133     afs_int32 reserved[5];
134     afs_int32 entries[COSIZE];
135 };
136
137 /* The following are flags for PR_ListEntries() */
138 #define PRUSERS  0x1
139 #define PRGROUPS 0x2