]> sbz's 6dev Repos - android-sysinfo/.git/blob - sysinfo.c
Define nitems() to count container size
[android-sysinfo/.git] / sysinfo.c
1 #include <fcntl.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <unistd.h>
6
7 #include <sys/types.h>
8 #include <sys/uio.h>
9 #include <sys/utsname.h>
10 #include <sys/system_properties.h>
11
12 #define nitems(container)      (sizeof((container)) / sizeof((container)[0]))
13
14 struct prop {
15     char *key_name;
16     char *prop_name;
17 };
18
19 struct android_version {
20     char *number;
21     char *name;
22 };
23
24 char *
25 android_to_name(const char *version)
26 {
27     int i;
28     char *name = NULL;
29
30     /* https://en.wikipedia.org/wiki/Android_version_history#Overview */
31     struct android_version versions[] = {
32         {"9.0",     "Pie"},
33         {"8.0",     "Oreo"},
34         {"7.0",     "Nougat"},
35         {"6.0",     "Marshmallow"},
36         {"5.0",     "Lollipop"},
37         {"4.4",     "KitKat"},
38         {"4.1",     "Jelly Bean"},
39         {"4.0",     "Ice Cream Sandwich"},
40         {"3.0",     "Honeycomb"},
41         {"2.3",     "Gingerbread"},
42         {"2.2",     "Froyo"},
43         {"2.0",     "Eclair"},
44         {"1.6",     "Donut"},
45         {"1.5",     "Cupcake"},
46     };
47
48
49     for (i = 0; i < nitems(versions); i++ ) {
50         if (!strncmp(version, versions[i].number, 3)) {
51             name = versions[i].name;
52             break;
53         }
54     }
55
56     if (name == NULL) {
57         for (i = 0; i < nitems(versions); i++ ) {
58             if (!strncmp(version, versions[i].number, 1)) {
59                 name = versions[i].name;
60                 break;
61             }
62         }
63     }
64
65     if (name == NULL)
66         name = "Unknow";
67
68     return (name);
69 }
70
71 static void system_kernel(void)
72 {
73     struct utsname uts;
74     char build_host[512];
75     char build_user[512];
76
77     __system_property_get("ro.build.host", build_host);
78     __system_property_get("ro.build.user", build_user);
79
80     if (uname(&uts) != -1) {
81         printf("%-25s: %s %s %s@%s %s %s\n", "Kernel version", uts.sysname,
82                 uts.release, build_user, build_host, uts.version, uts.machine);
83     }
84 }
85
86 static void system_cpu(void)
87 {
88     int i, fd, bytes;
89     char *p;
90     char buffer[1024];
91     const char *needle = "Processor    :";
92
93     fd = open("/proc/cpuinfo", O_RDONLY);
94     if (fd == -1) {
95         return;
96     }
97
98     bytes = read(fd, buffer, sizeof(buffer) - 1);
99     if (bytes == -1) {
100         return;
101     }
102
103     buffer[bytes] = '\0';
104     p = buffer;
105
106     p = strstr(p, "Processor    :");
107     p += strlen(needle) - 1;
108
109     printf("%-25s: ", "CPU");
110     while ( *p != '\n') {
111         printf("%c", *p++);
112     }
113
114     printf("\n");
115
116     close(fd);
117 }
118
119 static void system_properties(struct prop *array, int size)
120 {
121     int i, len;
122     char value[1024] = {0};
123
124     for (i=0; i < size; i++) {
125         if (i == 4)
126             system_kernel();
127
128         len = __system_property_get(array[i].prop_name, value);
129         value[len] = '\0';
130         if (i == 2) {
131             printf("%-25s: %s", array[i].key_name, value);
132             printf(" (%s)\n", android_to_name(value));
133         } else {
134             printf("%-25s: %s\n", array[i].key_name, value);
135         }
136     }
137
138     system_cpu();
139 }
140
141 int
142 main(void)
143 {
144     struct prop props[] = {
145         {.key_name = "Model name", .prop_name = "ro.product.model"},
146         {.key_name = "Android codename", .prop_name = "ro.build.product"},
147         {.key_name = "Android version", .prop_name = "ro.build.version.release"},
148         {.key_name = "Android SDK version", .prop_name = "ro.build.version.sdk"},
149         {.key_name = "Baseband version", .prop_name = "gsm.version.baseband"},
150         {.key_name = "Build number", .prop_name = "ro.build.display.id"},
151     };
152
153     system_properties(props, nitems(props));
154
155     return (0);
156 }