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