1 /*-------------------------------------------------------------------------
2  *
3  * config_info.c
4  *		Common code for pg_config output
5  *
6  *
7  * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
8  * Portions Copyright (c) 1994, Regents of the University of California
9  *
10  *
11  * IDENTIFICATION
12  *	  src/common/config_info.c
13  *
14  *-------------------------------------------------------------------------
15  */
16 
17 #ifndef FRONTEND
18 #include "postgres.h"
19 #else
20 #include "postgres_fe.h"
21 #endif
22 
23 #include "common/config_info.h"
24 
25 
26 /*
27  * get_configdata(const char *my_exec_path, size_t *configdata_len)
28  *
29  * Get configure-time constants. The caller is responsible
30  * for pfreeing the result.
31  */
32 ConfigData *
get_configdata(const char * my_exec_path,size_t * configdata_len)33 get_configdata(const char *my_exec_path, size_t *configdata_len)
34 {
35 	ConfigData *configdata;
36 	char		path[MAXPGPATH];
37 	char	   *lastsep;
38 	int			i = 0;
39 
40 	/* Adjust this to match the number of items filled below */
41 	*configdata_len = 23;
42 	configdata = (ConfigData *) palloc(*configdata_len * sizeof(ConfigData));
43 
44 	configdata[i].name = pstrdup("BINDIR");
45 	strlcpy(path, my_exec_path, sizeof(path));
46 	lastsep = strrchr(path, '/');
47 	if (lastsep)
48 		*lastsep = '\0';
49 	cleanup_path(path);
50 	configdata[i].setting = pstrdup(path);
51 	i++;
52 
53 	configdata[i].name = pstrdup("DOCDIR");
54 	get_doc_path(my_exec_path, path);
55 	cleanup_path(path);
56 	configdata[i].setting = pstrdup(path);
57 	i++;
58 
59 	configdata[i].name = pstrdup("HTMLDIR");
60 	get_html_path(my_exec_path, path);
61 	cleanup_path(path);
62 	configdata[i].setting = pstrdup(path);
63 	i++;
64 
65 	configdata[i].name = pstrdup("INCLUDEDIR");
66 	get_include_path(my_exec_path, path);
67 	cleanup_path(path);
68 	configdata[i].setting = pstrdup(path);
69 	i++;
70 
71 	configdata[i].name = pstrdup("PKGINCLUDEDIR");
72 	get_pkginclude_path(my_exec_path, path);
73 	cleanup_path(path);
74 	configdata[i].setting = pstrdup(path);
75 	i++;
76 
77 	configdata[i].name = pstrdup("INCLUDEDIR-SERVER");
78 	get_includeserver_path(my_exec_path, path);
79 	cleanup_path(path);
80 	configdata[i].setting = pstrdup(path);
81 	i++;
82 
83 	configdata[i].name = pstrdup("LIBDIR");
84 	get_lib_path(my_exec_path, path);
85 	cleanup_path(path);
86 	configdata[i].setting = pstrdup(path);
87 	i++;
88 
89 	configdata[i].name = pstrdup("PKGLIBDIR");
90 	get_pkglib_path(my_exec_path, path);
91 	cleanup_path(path);
92 	configdata[i].setting = pstrdup(path);
93 	i++;
94 
95 	configdata[i].name = pstrdup("LOCALEDIR");
96 	get_locale_path(my_exec_path, path);
97 	cleanup_path(path);
98 	configdata[i].setting = pstrdup(path);
99 	i++;
100 
101 	configdata[i].name = pstrdup("MANDIR");
102 	get_man_path(my_exec_path, path);
103 	cleanup_path(path);
104 	configdata[i].setting = pstrdup(path);
105 	i++;
106 
107 	configdata[i].name = pstrdup("SHAREDIR");
108 	get_share_path(my_exec_path, path);
109 	cleanup_path(path);
110 	configdata[i].setting = pstrdup(path);
111 	i++;
112 
113 	configdata[i].name = pstrdup("SYSCONFDIR");
114 	get_etc_path(my_exec_path, path);
115 	cleanup_path(path);
116 	configdata[i].setting = pstrdup(path);
117 	i++;
118 
119 	configdata[i].name = pstrdup("PGXS");
120 	get_pkglib_path(my_exec_path, path);
121 	strlcat(path, "/pgxs/src/makefiles/pgxs.mk", sizeof(path));
122 	cleanup_path(path);
123 	configdata[i].setting = pstrdup(path);
124 	i++;
125 
126 	configdata[i].name = pstrdup("CONFIGURE");
127 #ifdef VAL_CONFIGURE
128 	configdata[i].setting = pstrdup(VAL_CONFIGURE);
129 #else
130 	configdata[i].setting = pstrdup(_("not recorded"));
131 #endif
132 	i++;
133 
134 	configdata[i].name = pstrdup("CC");
135 #ifdef VAL_CC
136 	configdata[i].setting = pstrdup(VAL_CC);
137 #else
138 	configdata[i].setting = pstrdup(_("not recorded"));
139 #endif
140 	i++;
141 
142 	configdata[i].name = pstrdup("CPPFLAGS");
143 #ifdef VAL_CPPFLAGS
144 	configdata[i].setting = pstrdup(VAL_CPPFLAGS);
145 #else
146 	configdata[i].setting = pstrdup(_("not recorded"));
147 #endif
148 	i++;
149 
150 	configdata[i].name = pstrdup("CFLAGS");
151 #ifdef VAL_CFLAGS
152 	configdata[i].setting = pstrdup(VAL_CFLAGS);
153 #else
154 	configdata[i].setting = pstrdup(_("not recorded"));
155 #endif
156 	i++;
157 
158 	configdata[i].name = pstrdup("CFLAGS_SL");
159 #ifdef VAL_CFLAGS_SL
160 	configdata[i].setting = pstrdup(VAL_CFLAGS_SL);
161 #else
162 	configdata[i].setting = pstrdup(_("not recorded"));
163 #endif
164 	i++;
165 
166 	configdata[i].name = pstrdup("LDFLAGS");
167 #ifdef VAL_LDFLAGS
168 	configdata[i].setting = pstrdup(VAL_LDFLAGS);
169 #else
170 	configdata[i].setting = pstrdup(_("not recorded"));
171 #endif
172 	i++;
173 
174 	configdata[i].name = pstrdup("LDFLAGS_EX");
175 #ifdef VAL_LDFLAGS_EX
176 	configdata[i].setting = pstrdup(VAL_LDFLAGS_EX);
177 #else
178 	configdata[i].setting = pstrdup(_("not recorded"));
179 #endif
180 	i++;
181 
182 	configdata[i].name = pstrdup("LDFLAGS_SL");
183 #ifdef VAL_LDFLAGS_SL
184 	configdata[i].setting = pstrdup(VAL_LDFLAGS_SL);
185 #else
186 	configdata[i].setting = pstrdup(_("not recorded"));
187 #endif
188 	i++;
189 
190 	configdata[i].name = pstrdup("LIBS");
191 #ifdef VAL_LIBS
192 	configdata[i].setting = pstrdup(VAL_LIBS);
193 #else
194 	configdata[i].setting = pstrdup(_("not recorded"));
195 #endif
196 	i++;
197 
198 	configdata[i].name = pstrdup("VERSION");
199 	configdata[i].setting = pstrdup("PostgreSQL " PG_VERSION);
200 	i++;
201 
202 	Assert(i == *configdata_len);
203 
204 	return configdata;
205 }
206