1 #include "rktio.h"
2 #include "rktio_private.h"
3 #include <stdlib.h>
4 #include <string.h>
5 #ifdef OS_X
6 # include <sys/types.h>
7 # include <sys/sysctl.h>
8 #endif
9 
rktio_init(void)10 rktio_t *rktio_init(void)
11 {
12   rktio_t *rktio;
13 
14   rktio = malloc(sizeof(rktio_t));
15   memset(rktio, 0, sizeof(rktio_t));
16 
17   rktio_alloc_global_poll_set(rktio);
18   if (!rktio_initialize_signal(rktio)) {
19     rktio_destroy(rktio);
20     return NULL;
21   }
22 
23   if (!rktio_process_init(rktio)) {
24     rktio_destroy(rktio);
25     return NULL;
26   }
27 
28 #ifdef RKTIO_SYSTEM_WINDOWS
29   if (!rktio_winsock_init(rktio)) {
30     rktio_destroy(rktio);
31     return NULL;
32   }
33 #endif
34 
35   rktio_init_time(rktio);
36   rktio_init_wide(rktio);
37   rktio_init_cpu(rktio);
38 
39   rktio_syslog_init(rktio);
40 
41   rktio_convert_init(rktio);
42 
43 #ifdef OS_X
44   {
45     int a[2], i, k = 0;
46     size_t len;
47     char *vers;
48 
49     a[0] = CTL_KERN;
50     a[1] = KERN_OSRELEASE;
51     sysctl(a, 2, NULL, &len, NULL, 0);
52     vers = malloc(len * sizeof(char));
53     sysctl(a, 2, vers, &len, NULL, 0);
54 
55     for (i = 0; (i < len) && (vers[i] != '.'); i++)
56       k = (k * 10) + vers[i] - '0';
57 
58     rktio->macos_kernel_version = k;
59 
60     free(vers);
61   }
62 #endif
63 
64   return rktio;
65 }
66 
rktio_destroy(rktio_t * rktio)67 void rktio_destroy(rktio_t *rktio)
68 {
69   rktio_stop_background(rktio);
70   rktio_syslog_clean(rktio);
71   rktio_convert_deinit(rktio);
72   rktio_dll_clean(rktio);
73   rktio_error_clean(rktio);
74   rktio_process_deinit(rktio);
75   rktio_free_ghbn(rktio);
76   rktio_free_global_poll_set(rktio);
77   rktio_stop_fs_change(rktio);
78   rktio_free_signal(rktio);
79 #ifdef RKTIO_SYSTEM_WINDOWS
80   rktio_winsock_done(rktio);
81 #endif
82   free(rktio);
83 }
84 
85 /* Useful on Windows to make sure everyone is using the same malloc()
86    and free(): */
rktio_free(void * p)87 void rktio_free(void *p)
88 {
89   free(p);
90 }
91