added latency tool
[tridge/junkcode.git] / display_sid.c
1 /*
2   display a binary sid
3
4   assumes x86 CPU. This code is NOT portable.
5
6   tridge@samba.org, December 2003
7 */
8
9 #include <stdio.h>
10 #include <sys/types.h>
11 #include <fcntl.h>
12 #include <sys/stat.h>
13 #include <stdlib.h>
14 #include <unistd.h>
15 #include <errno.h>
16
17
18 typedef unsigned char uint8;
19 typedef unsigned int  uint32;
20
21 struct dom_sid {
22 #if CONFORMANT_SID
23         uint32  conf_size;
24 #endif
25         uint8  sid_rev_num;
26         uint8  num_auths;
27         uint8  id_auth[6];
28         uint32 sub_auths[0];
29 };
30
31
32 static void display_sid(const char *blob, off_t size)
33 {
34         struct dom_sid *sid = (struct dom_sid *)blob;
35         uint32 ia;
36         int i;
37
38         if (size < sizeof(*sid) ||
39 #if CONFORMANT_SID
40             sid->conf_size != sid->num_auths ||
41 #endif
42             size != sizeof(*sid) + 4*sid->num_auths) {
43                 printf("Bad sid blob - maybe its not a IDL conformant SID?\n");
44                 exit(1);
45         }
46
47         ia = (sid->id_auth[5]) +
48                 (sid->id_auth[4] << 8 ) +
49                 (sid->id_auth[3] << 16) +
50                 (sid->id_auth[2] << 24);
51
52         printf("S-%u-%u", (unsigned)sid->sid_rev_num, (unsigned)ia);
53
54         for (i=0;i<sid->num_auths;i++) {
55                 printf("-%u", (unsigned)sid->sub_auths[i]);
56         }
57         printf("\n");
58 }
59
60
61 static const char *file_load(const char *filename, off_t *size)
62 {
63         char *ret;
64         struct stat st;
65         int fd;
66
67         fd = open(filename, O_RDONLY);
68         if (fd == -1) return NULL;
69
70         fstat(fd, &st);
71         
72         ret = malloc(st.st_size);
73         if (!ret) return NULL;
74
75         if (read(fd, ret, st.st_size) != st.st_size) {
76                 free(ret);
77                 return NULL;
78         }
79
80         *size = st.st_size;
81
82         return ret;
83 }
84
85 int main(int argc, const char *argv[])
86 {
87         const char *filename;
88         const char *blob;
89         off_t size;
90
91         if (argc < 2) {
92                 fprintf(stderr,"Usage: display_sid <filename>\n");
93                 exit(1);
94         }
95         
96         filename = argv[1];
97
98         blob = file_load(filename, &size);
99         if (!blob) {
100                 perror(filename);
101                 exit(1);
102         }
103
104         display_sid(blob, size);
105         return 0;
106 }
107