xref: /aosp_15_r20/external/bcc/examples/cgroupid/cgroupid.c (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker #define _GNU_SOURCE
2*387f9dfdSAndroid Build Coastguard Worker #include <stdlib.h>
3*387f9dfdSAndroid Build Coastguard Worker #include <stdio.h>
4*387f9dfdSAndroid Build Coastguard Worker #include <sys/types.h>
5*387f9dfdSAndroid Build Coastguard Worker #include <sys/stat.h>
6*387f9dfdSAndroid Build Coastguard Worker #include <fcntl.h>
7*387f9dfdSAndroid Build Coastguard Worker #include <stdint.h>
8*387f9dfdSAndroid Build Coastguard Worker #include <ctype.h>
9*387f9dfdSAndroid Build Coastguard Worker #include <unistd.h>
10*387f9dfdSAndroid Build Coastguard Worker #include <linux/magic.h>
11*387f9dfdSAndroid Build Coastguard Worker #include <sys/vfs.h>
12*387f9dfdSAndroid Build Coastguard Worker #include <string.h>
13*387f9dfdSAndroid Build Coastguard Worker #include <errno.h>
14*387f9dfdSAndroid Build Coastguard Worker 
15*387f9dfdSAndroid Build Coastguard Worker /* 67e9c74b8a873408c27ac9a8e4c1d1c8d72c93ff (4.5) */
16*387f9dfdSAndroid Build Coastguard Worker #ifndef CGROUP2_SUPER_MAGIC
17*387f9dfdSAndroid Build Coastguard Worker #define CGROUP2_SUPER_MAGIC 0x63677270
18*387f9dfdSAndroid Build Coastguard Worker #endif
19*387f9dfdSAndroid Build Coastguard Worker 
20*387f9dfdSAndroid Build Coastguard Worker struct cgid_file_handle
21*387f9dfdSAndroid Build Coastguard Worker {
22*387f9dfdSAndroid Build Coastguard Worker   //struct file_handle handle;
23*387f9dfdSAndroid Build Coastguard Worker   unsigned int handle_bytes;
24*387f9dfdSAndroid Build Coastguard Worker   int handle_type;
25*387f9dfdSAndroid Build Coastguard Worker   uint64_t cgid;
26*387f9dfdSAndroid Build Coastguard Worker };
27*387f9dfdSAndroid Build Coastguard Worker 
get_cgroupid(const char * pathname)28*387f9dfdSAndroid Build Coastguard Worker uint64_t get_cgroupid(const char *pathname) {
29*387f9dfdSAndroid Build Coastguard Worker   struct statfs fs;
30*387f9dfdSAndroid Build Coastguard Worker   int err;
31*387f9dfdSAndroid Build Coastguard Worker   struct cgid_file_handle *h;
32*387f9dfdSAndroid Build Coastguard Worker   int mount_id;
33*387f9dfdSAndroid Build Coastguard Worker   uint64_t ret;
34*387f9dfdSAndroid Build Coastguard Worker 
35*387f9dfdSAndroid Build Coastguard Worker   err = statfs(pathname, &fs);
36*387f9dfdSAndroid Build Coastguard Worker   if (err != 0) {
37*387f9dfdSAndroid Build Coastguard Worker     fprintf (stderr, "statfs on %s failed: %s\n", pathname, strerror(errno));
38*387f9dfdSAndroid Build Coastguard Worker     exit(1);
39*387f9dfdSAndroid Build Coastguard Worker   }
40*387f9dfdSAndroid Build Coastguard Worker 
41*387f9dfdSAndroid Build Coastguard Worker   if ((fs.f_type != (typeof(fs.f_type)) CGROUP2_SUPER_MAGIC)) {
42*387f9dfdSAndroid Build Coastguard Worker     fprintf (stderr, "File %s is not on a cgroup2 mount.\n", pathname);
43*387f9dfdSAndroid Build Coastguard Worker     exit(1);
44*387f9dfdSAndroid Build Coastguard Worker   }
45*387f9dfdSAndroid Build Coastguard Worker 
46*387f9dfdSAndroid Build Coastguard Worker   h = malloc(sizeof(struct cgid_file_handle));
47*387f9dfdSAndroid Build Coastguard Worker   if (!h) {
48*387f9dfdSAndroid Build Coastguard Worker     fprintf (stderr, "Cannot allocate memory.\n");
49*387f9dfdSAndroid Build Coastguard Worker     exit(1);
50*387f9dfdSAndroid Build Coastguard Worker   }
51*387f9dfdSAndroid Build Coastguard Worker 
52*387f9dfdSAndroid Build Coastguard Worker   h->handle_bytes = 8;
53*387f9dfdSAndroid Build Coastguard Worker   err = name_to_handle_at(AT_FDCWD, pathname, (struct file_handle *)h, &mount_id, 0);
54*387f9dfdSAndroid Build Coastguard Worker   if (err != 0) {
55*387f9dfdSAndroid Build Coastguard Worker     fprintf (stderr, "name_to_handle_at failed: %s\n", strerror(errno));
56*387f9dfdSAndroid Build Coastguard Worker     exit(1);
57*387f9dfdSAndroid Build Coastguard Worker   }
58*387f9dfdSAndroid Build Coastguard Worker 
59*387f9dfdSAndroid Build Coastguard Worker   if (h->handle_bytes != 8) {
60*387f9dfdSAndroid Build Coastguard Worker     fprintf (stderr, "Unexpected handle size: %d. \n", h->handle_bytes);
61*387f9dfdSAndroid Build Coastguard Worker     exit(1);
62*387f9dfdSAndroid Build Coastguard Worker   }
63*387f9dfdSAndroid Build Coastguard Worker 
64*387f9dfdSAndroid Build Coastguard Worker   ret = h->cgid;
65*387f9dfdSAndroid Build Coastguard Worker   free(h);
66*387f9dfdSAndroid Build Coastguard Worker 
67*387f9dfdSAndroid Build Coastguard Worker   return ret;
68*387f9dfdSAndroid Build Coastguard Worker }
69*387f9dfdSAndroid Build Coastguard Worker 
usage()70*387f9dfdSAndroid Build Coastguard Worker void usage() {
71*387f9dfdSAndroid Build Coastguard Worker     fprintf (stderr, "Usage: cgroupid FORMAT FILE\n");
72*387f9dfdSAndroid Build Coastguard Worker     fprintf (stderr, "Print the cgroup id of a cgroup2 directory.\n");
73*387f9dfdSAndroid Build Coastguard Worker     fprintf (stderr, "Example: cgroupid print-hex /sys/fs/cgroup/unified/system.slice/test.service\n");
74*387f9dfdSAndroid Build Coastguard Worker     fprintf (stderr, "\n");
75*387f9dfdSAndroid Build Coastguard Worker     fprintf (stderr, "Format:\n");
76*387f9dfdSAndroid Build Coastguard Worker     fprintf (stderr, "  number    print the cgroup id as a number\n");
77*387f9dfdSAndroid Build Coastguard Worker     fprintf (stderr, "  hex       print the cgroup id as a hexadecimal, suitable for bpftool\n");
78*387f9dfdSAndroid Build Coastguard Worker     fprintf (stderr, "\n");
79*387f9dfdSAndroid Build Coastguard Worker }
80*387f9dfdSAndroid Build Coastguard Worker 
main(int argc,char ** argv)81*387f9dfdSAndroid Build Coastguard Worker int main(int argc, char **argv) {
82*387f9dfdSAndroid Build Coastguard Worker   uint64_t cgroupid;
83*387f9dfdSAndroid Build Coastguard Worker   int i;
84*387f9dfdSAndroid Build Coastguard Worker 
85*387f9dfdSAndroid Build Coastguard Worker   if (argc != 3 || (strcmp(argv[1], "number") != 0 && strcmp(argv[1], "hex"))) {
86*387f9dfdSAndroid Build Coastguard Worker     usage();
87*387f9dfdSAndroid Build Coastguard Worker     exit(1);
88*387f9dfdSAndroid Build Coastguard Worker   }
89*387f9dfdSAndroid Build Coastguard Worker 
90*387f9dfdSAndroid Build Coastguard Worker   cgroupid = get_cgroupid(argv[2]);
91*387f9dfdSAndroid Build Coastguard Worker 
92*387f9dfdSAndroid Build Coastguard Worker   if (strcmp(argv[1], "number") == 0)
93*387f9dfdSAndroid Build Coastguard Worker     printf("%lu\n", cgroupid);
94*387f9dfdSAndroid Build Coastguard Worker 
95*387f9dfdSAndroid Build Coastguard Worker   if (strcmp(argv[1], "hex") == 0) {
96*387f9dfdSAndroid Build Coastguard Worker     for (i=0; i<8; i++) {
97*387f9dfdSAndroid Build Coastguard Worker       printf("%02x%s", ((unsigned char *)&cgroupid)[i], i == 7 ? "\n":" ");
98*387f9dfdSAndroid Build Coastguard Worker     }
99*387f9dfdSAndroid Build Coastguard Worker   }
100*387f9dfdSAndroid Build Coastguard Worker   return 0;
101*387f9dfdSAndroid Build Coastguard Worker }
102