281860e951934c7646eeef5459cf3e01e8372780
[openafs.git] / src / ptserver / display.c
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 #include <afsconfig.h>
11 #include <afs/param.h>
12
13 #include <roken.h>
14
15 #include <afs/stds.h>
16 #include <sys/types.h>
17 #ifdef AFS_NT40_ENV
18 #include <winsock2.h>
19 #else
20 #include <netinet/in.h>
21 #endif
22 #include <string.h>
23 #include <stdio.h>
24 #include "ptserver.h"
25
26 #include "display.h"
27
28 #ifdef PR_REMEMBER_TIMES
29
30 # include <time.h>
31
32
33 static char *
34 pr_TimeToString(time_t clock)
35 {
36     struct tm *tm;
37     static char buffer[32];
38     static int this_year = 0;
39
40     if (clock == 0)
41         return "time-not-set  ";
42     if (!this_year) {
43         time_t now = time(0);
44         tm = localtime(&now);
45         this_year = tm->tm_year;
46     }
47     tm = localtime(&clock);
48     if (tm->tm_year != this_year)
49         strftime(buffer, 32, "%m/%d/%Y %H:%M:%S", tm);
50     else
51         strftime(buffer, 32, "%m/%d %H:%M:%S", tm);
52     return buffer;
53 }
54 #endif
55
56 #define host(a) (hostOrder ? (a) : ntohl(a))
57
58 static void
59 PrintEntries(FILE *f, int hostOrder, int indent, struct prentry *e, int n)
60 {
61     int i;
62     int newline;
63
64     newline = 0;
65     for (i = 0; i < n; i++) {
66         if (e->entries[i] == 0)
67             break;
68
69         if (i == 0)
70             fprintf(f, "%*sids ", indent, "");
71         else if (newline == 0)
72             fprintf(f, "%*s", indent + 4, "");
73
74         if (host(e->entries[i]) == PRBADID)
75             fprintf(f, " EMPTY");
76         else
77             fprintf(f, "%6d", host(e->entries[i]));
78         newline = 1;
79         if (i % 10 == 9) {
80             fprintf(f, "\n");
81             newline = 0;
82         } else
83             fprintf(f, " ");
84     }
85     if (newline)
86         fprintf(f, "\n");
87 }
88
89 int
90 pr_PrintEntry(FILE *f, int hostOrder, afs_int32 ea, struct prentry *e, int indent)
91 {
92     int i;
93
94     if (e->cellid)
95         fprintf(f, "cellid == %d\n", host(e->cellid));
96     for (i = 0; i < sizeof(e->reserved) / sizeof(e->reserved[0]); i++)
97         if (e->reserved[i])
98             fprintf(f, "reserved field [%d] not zero: %d\n", i,
99                     host(e->reserved[i]));
100
101     fprintf(f, "%*s", indent, "");
102     fprintf(f, "Entry at %d: flags 0x%x, id %di, next %d.\n", ea,
103             host(e->flags), host(e->id), host(e->next));
104 #ifdef PR_REMEMBER_TIMES
105     fprintf(f, "%*s", indent, "");
106     fprintf(f, "c:%s ", pr_TimeToString(host(e->createTime)));
107     fprintf(f, "a:%s ", pr_TimeToString(host(e->addTime)));
108     fprintf(f, "r:%s ", pr_TimeToString(host(e->removeTime)));
109     fprintf(f, "n:%s\n", pr_TimeToString(host(e->changeTime)));
110 #endif
111     if (host(e->flags) & PRCONT)
112         PrintEntries(f, hostOrder, indent, e, COSIZE);
113     else {                      /* regular entry */
114         PrintEntries(f, hostOrder, indent, e, PRSIZE);
115         fprintf(f, "%*s", indent, "");
116         fprintf(f, "hash (id %d name %d).  Owner %di, creator %di\n",
117                 host(e->nextID), host(e->nextName), host(e->owner),
118                 host(e->creator));
119         fprintf(f, "%*s", indent, "");
120 #if defined(SUPERGROUPS)
121         fprintf(f, "quota groups %d, foreign users %d.  Mem: %d, cntsg: %d\n",
122                 host(e->ngroups), host(e->nusers), host(e->count),
123                 host(e->instance));
124 #else
125         fprintf(f, "quota groups %d, foreign users %d.  Mem: %d, inst: %d\n",
126                 host(e->ngroups), host(e->nusers), host(e->count),
127                 host(e->instance));
128 #endif
129         fprintf(f, "%*s", indent, "");
130 #if defined(SUPERGROUPS)
131         fprintf(f, "Owned chain %d, next owned %d, nextsg %d, sg (%d %d).\n",
132                 host(e->owned), host(e->nextOwned), host(e->parent),
133                 host(e->sibling), host(e->child));
134 #else
135         fprintf(f, "Owned chain %d, next owned %d, inst ptrs(%d %d %d).\n",
136                 host(e->owned), host(e->nextOwned), host(e->parent),
137                 host(e->sibling), host(e->child));
138 #endif
139         fprintf(f, "%*s", indent, "");
140         if (strlen(e->name) >= PR_MAXNAMELEN)
141             fprintf(f, "NAME TOO LONG: ");
142         fprintf(f, "Name is '%.*s'\n", PR_MAXNAMELEN, e->name);
143     }
144     return 0;
145 }