1 #include <grp.h>
2 #include <pwd.h>
3
4 #if defined(__sun__)
5 #include <sys/systeminfo.h>
6 #else
7 #include <sys/utsname.h>
8 #endif
9
10 #include "declarations.h"
11 #include "node.h"
12
13 #if defined(_SYS_NMLN)
14 #undef CONFIG_HOSTNAME_LENGTH
15 #undef CONFIG_LOGINNAME_LENGTH
16 #define CONFIG_HOSTNAME_LENGTH _SYS_NMLN
17 #define CONFIG_LOGINNAME_LENGTH _SYS_NMLN
18 #endif
19
20
21
node_init(void)22 void node_init(void) {
23 unsigned int i;
24
25 struct passwd *p;
26 struct group *g;
27 #if ! defined(__sun__)
28 struct utsname u;
29 #endif
30 if(n != NULL) (void) node_free();
31
32 APP_MALLOC_RET_VOID(n, sizeof(struct n_i));
33
34 i = 0;
35
36 if((n->s = malloc((size_t) CONFIG_LINE_LENGTH + sizeof(char))) == NULL) ++i;
37 if((n->r = malloc((size_t) CONFIG_LINE_LENGTH + sizeof(char))) == NULL) ++i;
38 if((n->m = malloc((size_t) CONFIG_LINE_LENGTH + sizeof(char))) == NULL) ++i;
39
40 if((n->n = malloc((size_t) CONFIG_HOSTNAME_LENGTH + sizeof(char))) == NULL) ++i;
41
42 if((n->u = malloc((size_t) CONFIG_LOGINNAME_LENGTH + sizeof(char))) == NULL) ++i;
43 if((n->g = malloc((size_t) CONFIG_LINE_LENGTH + sizeof(char))) == NULL) ++i;
44 if((n->h = malloc((size_t) CONFIG_PATH_LENGTH + sizeof(char))) == NULL) ++i;
45
46 if(i != 0) {
47 (void) fprintf(
48 stderr,
49 _("Failed to allocate memory: %s.%c"),
50 strerror(errno), CONFIG_LINE_FEED
51 );
52
53 (void) node_free();
54
55 return;
56 }
57
58 /* Resolve node info */
59 (void) memset((void *) n->n, 0, CONFIG_HOSTNAME_LENGTH + sizeof(char));
60
61 if(gethostname(n->n, CONFIG_HOSTNAME_LENGTH) != 0) {
62 #if defined(__sun__)
63 (void) sysinfo(SI_HOSTNAME, n->n, CONFIG_HOSTNAME_LENGTH);
64 #else
65 if(uname(&u) != -1) {
66 (void) snprintf(n->n, CONFIG_HOSTNAME_LENGTH, "%s", u.nodename);
67 }
68 #endif
69 }
70
71 /* Resolve machine info */
72 (void) memset((void *) n->s, 0, CONFIG_LINE_LENGTH + sizeof(char));
73 (void) memset((void *) n->r, 0, CONFIG_LINE_LENGTH + sizeof(char));
74 (void) memset((void *) n->m, 0, CONFIG_LINE_LENGTH + sizeof(char));
75 #if defined(__sun__)
76 (void) sysinfo(SI_SYSNAME, n->s, CONFIG_LINE_LENGTH);
77 (void) sysinfo(SI_RELEASE, n->r, CONFIG_LINE_LENGTH);
78 (void) sysinfo(SI_MACHINE, n->m, CONFIG_LINE_LENGTH);
79 #else
80 if(uname(&u) != -1) {
81 (void) snprintf(n->s, CONFIG_LINE_LENGTH, "%s", u.sysname);
82 (void) snprintf(n->r, CONFIG_LINE_LENGTH, "%s", u.release);
83 (void) snprintf(n->m, CONFIG_LINE_LENGTH, "%s", u.machine);
84 }
85 #endif
86 /* Resolve user info */
87 (void) memset((void *) n->u, 0, CONFIG_LOGINNAME_LENGTH + sizeof(char));
88 (void) memset((void *) n->g, 0, CONFIG_LINE_LENGTH + sizeof(char));
89 (void) memset((void *) n->h, 0, CONFIG_PATH_LENGTH + sizeof(char));
90
91 if((p = getpwuid(getuid())) != NULL) {
92 (void) snprintf(n->u, CONFIG_LOGINNAME_LENGTH, "%s", p->pw_name);
93 (void) snprintf(n->h, CONFIG_PATH_LENGTH, "%s", p->pw_dir);
94 }
95
96 if((g = getgrgid(getgid())) != NULL) {
97 (void) snprintf(n->g, CONFIG_LINE_LENGTH, "%s", g->gr_name);
98 }
99 }
100
node_free(void)101 void node_free(void) {
102 if(n != NULL) {
103 if(n->s != NULL) (void) free(n->s);
104 if(n->r != NULL) (void) free(n->r);
105 if(n->m != NULL) (void) free(n->m);
106
107 if(n->n != NULL) (void) free(n->n);
108
109 if(n->u != NULL) (void) free(n->u);
110 if(n->g != NULL) (void) free(n->g);
111 if(n->h != NULL) (void) free(n->h);
112
113 (void) free(n);
114
115 n = NULL;
116 }
117 }
118
node_get_system(void)119 char *node_get_system(void) {
120 if(n == NULL) return(NULL);
121
122 return(n->s);
123 }
124
node_get_release(void)125 char *node_get_release(void) {
126 if(n == NULL) return(NULL);
127
128 return(n->r);
129 }
130
node_get_machine(void)131 char *node_get_machine(void) {
132 if(n == NULL) return(NULL);
133
134 return(n->m);
135 }
136
node_get_node(void)137 char *node_get_node(void) {
138 if(n == NULL) return(NULL);
139
140 return(n->n);
141 }
142
node_get_user(void)143 char *node_get_user(void) {
144 if(n == NULL) return(NULL);
145
146 return(n->u);
147 }
148
node_get_group(void)149 char *node_get_group(void) {
150 if(n == NULL) return(NULL);
151
152 return(n->g);
153 }
154
node_get_homedir(void)155 char *node_get_homedir(void) {
156 if(n == NULL) return(NULL);
157
158 return(n->h);
159 }
160