1*2b54f0dbSXin Li #include <stdio.h>
2*2b54f0dbSXin Li #include <stdlib.h>
3*2b54f0dbSXin Li #include <string.h>
4*2b54f0dbSXin Li
5*2b54f0dbSXin Li #include <unistd.h>
6*2b54f0dbSXin Li #include <fcntl.h>
7*2b54f0dbSXin Li #include <errno.h>
8*2b54f0dbSXin Li
9*2b54f0dbSXin Li
10*2b54f0dbSXin Li #define BUFFER_SIZE 4096
11*2b54f0dbSXin Li char buffer[BUFFER_SIZE];
12*2b54f0dbSXin Li
13*2b54f0dbSXin Li #define CPUINFO_PATH "/proc/cpuinfo"
14*2b54f0dbSXin Li
main(int argc,char ** argv)15*2b54f0dbSXin Li int main(int argc, char** argv) {
16*2b54f0dbSXin Li int file = open(CPUINFO_PATH, O_RDONLY);
17*2b54f0dbSXin Li if (file == -1) {
18*2b54f0dbSXin Li fprintf(stderr, "Error: failed to open %s: %s\n", CPUINFO_PATH, strerror(errno));
19*2b54f0dbSXin Li exit(EXIT_FAILURE);
20*2b54f0dbSXin Li }
21*2b54f0dbSXin Li
22*2b54f0dbSXin Li /* Only used for error reporting */
23*2b54f0dbSXin Li size_t position = 0;
24*2b54f0dbSXin Li char* data_start = buffer;
25*2b54f0dbSXin Li ssize_t bytes_read;
26*2b54f0dbSXin Li do {
27*2b54f0dbSXin Li bytes_read = read(file, buffer, BUFFER_SIZE);
28*2b54f0dbSXin Li if (bytes_read < 0) {
29*2b54f0dbSXin Li fprintf(stderr, "Error: failed to read file %s at position %zu: %s\n",
30*2b54f0dbSXin Li CPUINFO_PATH, position, strerror(errno));
31*2b54f0dbSXin Li exit(EXIT_FAILURE);
32*2b54f0dbSXin Li }
33*2b54f0dbSXin Li
34*2b54f0dbSXin Li position += (size_t) bytes_read;
35*2b54f0dbSXin Li if (bytes_read > 0) {
36*2b54f0dbSXin Li fwrite(buffer, 1, (size_t) bytes_read, stdout);
37*2b54f0dbSXin Li }
38*2b54f0dbSXin Li } while (bytes_read != 0);
39*2b54f0dbSXin Li
40*2b54f0dbSXin Li if (close(file) != 0) {
41*2b54f0dbSXin Li fprintf(stderr, "Error: failed to close %s: %s\n", CPUINFO_PATH, strerror(errno));
42*2b54f0dbSXin Li exit(EXIT_FAILURE);
43*2b54f0dbSXin Li }
44*2b54f0dbSXin Li return EXIT_SUCCESS;
45*2b54f0dbSXin Li }
46