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