1 /*
2  * Amanda, The Advanced Maryland Automatic Network Disk Archiver
3  * Copyright (c) 1991-1999 University of Maryland at College Park
4  * Copyright (c) 2007-2013 Zmanda, Inc.  All Rights Reserved.
5  * All Rights Reserved.
6  *
7  * Permission to use, copy, modify, distribute, and sell this software and its
8  * documentation for any purpose is hereby granted without fee, provided that
9  * the above copyright notice appear in all copies and that both that
10  * copyright notice and this permission notice appear in supporting
11  * documentation, and that the name of U.M. not be used in advertising or
12  * publicity pertaining to distribution of the software without specific,
13  * written prior permission.  U.M. makes no representations about the
14  * suitability of this software for any purpose.  It is provided "as is"
15  * without express or implied warranty.
16  *
17  * U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M.
19  * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
20  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
21  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
22  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23  *
24  * Authors: the Amanda Development Team.  Its members are listed in a
25  * file named AUTHORS, in the root directory of this distribution.
26  */
27 /*
28  * $Id: genversion.c 5713 2014-04-25 14:20:01Z martinea $
29  *
30  * dump the current Amanda version info
31  */
32 #include "amanda.h"
33 
34 /* distribution-time information */
35 #include "svn-info.h"
36 
37 /* build-time information */
38 #include "genversion.h"
39 
40 #define	LMARGIN		6
41 #define RMARGIN 	70
42 
43 static size_t linelen;
44 
45 #define	startline(title)  g_printf("  \"%-*s", LMARGIN, title); linelen = 0
46 #define	endline()	  g_printf("\\n\",\n")
47 
48 static void prstr(const char *);
49 static void prvar(const char *, const char *);
50 static void prundefvar(const char *var);
51 static void prnum(const char *var, long val);
52 
53 int main(int, char **);
54 
55 /* Print a string */
56 static void
prstr(const char * string)57 prstr(
58     const char *string)
59 {
60     size_t len = strlen(string) + 1;
61 
62     /*
63      * If this string overflows this line, and there's other stuff
64      * on the line, create a new one.
65      */
66     if (linelen > 0 && linelen + len >= RMARGIN - LMARGIN) {
67 	endline();
68 	startline("");
69     }
70     g_printf(" %s", string);
71     linelen += len;
72 }
73 
74 static char *buf = NULL;
75 static size_t buf_len = 0;
76 
77 /* Print a text variable */
78 static void
prvar(const char * var,const char * val)79 prvar(
80     const char *var,
81     const char *val)
82 {
83     size_t new_len;
84 
85     new_len = strlen(var)
86 	      + SIZEOF("=\\\"")
87 	      + strlen(val)
88 	      + SIZEOF("\\\"")
89 	      + 1;
90     if(new_len > buf_len) {
91 	free(buf);
92 	buf_len = new_len;
93 	buf = malloc(new_len);
94 	if (!buf) {
95 	    g_fprintf(stderr, _("genversion: Not enough memory"));
96 	    abort();
97 	    /*NOTREACHED*/
98 	}
99     }
100     g_snprintf(buf, buf_len, "%s=\\\"%s\\\"", var, val);	/* safe */
101     prstr(buf);
102 }
103 
104 /* Print a undef variable */
105 static void
prundefvar(const char * var)106 prundefvar(
107     const char *var)
108 {
109     size_t new_len;
110 
111     new_len = strlen(var)
112 	      + SIZEOF("=UNDEF")
113 	      + 1;
114     if(new_len > buf_len) {
115 	free(buf);
116 	buf_len = new_len;
117 	buf = malloc(new_len);		/* let it die if malloc() fails */
118 	if (!buf) {
119 	    g_fprintf(stderr, _("genversion: Not enough memory"));
120 	    abort();
121 	    /*NOTREACHED*/
122 	}
123     }
124     g_snprintf(buf, buf_len, "%s=UNDEF", var);	/* safe */
125     prstr(buf);
126 }
127 
128 /* Print a numeric variable */
129 static void
prnum(const char * var,long val)130 prnum(
131     const char *var,
132     long	val)
133 {
134     static char number[NUM_STR_SIZE];
135     size_t new_len;
136 
137     g_snprintf(number, SIZEOF(number), "%ld", val);
138     new_len = strlen(var)
139 	      + SIZEOF("=")
140 	      + strlen(number)
141 	      + 1;
142     if(new_len > buf_len) {
143 	free(buf);
144 	buf_len = new_len;
145 	buf = malloc(new_len);		/* let it die if malloc() fails */
146 	if (!buf) {
147 	    g_fprintf(stderr, _("genversion: Not enough memory"));
148 	    abort();
149 	    /*NOTREACHED*/
150 	}
151     }
152     g_snprintf(buf, buf_len, "%s=%s", var, number);		/* safe */
153     prstr(buf);
154 }
155 
156 int
main(int argc,char ** argv)157 main(
158     int		argc,
159     char **	argv)
160 {
161     const char *v;
162     char *verstr;
163     size_t v_len;
164 
165     (void)argc;	/* Quiet unused parameter warning */
166     (void)argv;	/* Quiet unused parameter warning */
167 
168     /*
169      * Configure program for internationalization:
170      *   1) Only set the message locale for now.
171      *   2) Set textdomain for all amanda related programs to "amanda"
172      *      We don't want to be forced to support dozens of message catalogs.
173      */
174     setlocale(LC_MESSAGES, "C");
175     textdomain("amanda");
176 
177     g_printf(_("/* version.c - generated by genversion.c - DO NOT EDIT! */\n"));
178     g_printf("const char * const version_info[] = {\n");
179 
180     startline("build:");
181     v = VERSION;
182     v_len = SIZEOF("Amanda-") + strlen(v) + 1;
183     verstr = malloc(v_len);
184     if (!verstr) {
185 	g_fprintf(stderr, _("genversion: Not enough memory"));
186 	abort();
187 	/*NOTREACHED*/
188     }
189     g_snprintf(verstr, v_len, "Amanda-%s", v);		/* safe */
190     prvar("VERSION", verstr);
191     free(verstr);
192 
193 #ifdef BUILT_DATE
194     prvar("BUILT_DATE", BUILT_DATE);
195 #else
196     prundefvar("BUILT_DATE");
197 #endif
198 
199 #ifdef BUILT_MACH
200     prvar("BUILT_MACH", BUILT_MACH);
201 #else
202     prundefvar("BUILT_MACH");
203 #endif
204 
205 #ifdef BUILT_REV
206     prvar("BUILT_REV", BUILT_REV);
207 #else
208     prundefvar("BUILT_REV");
209 #endif
210 
211 #ifdef BUILT_BRANCH
212     prvar("BUILT_BRANCH", BUILT_BRANCH);
213 #else
214     prundefvar("BUILT_BRANCH");
215 #endif
216 
217 #ifdef CC
218     prvar("CC", CC);
219 #else
220     prundefvar("CC");
221 #endif
222 
223     endline();
224 
225     startline("paths:");
226 
227     prvar("bindir", bindir);
228     prvar("sbindir", sbindir);
229     prvar("libexecdir", libexecdir);
230     prvar("amlibexecdir", amlibexecdir);
231     prvar("mandir", mandir);
232     prvar("AMANDA_TMPDIR", AMANDA_TMPDIR);
233 #ifdef AMANDA_DBGDIR
234     prvar("AMANDA_DBGDIR", AMANDA_DBGDIR);
235 #else
236     prundefvar("AMANDA_DBGDIR");
237 #endif
238     prvar("CONFIG_DIR", CONFIG_DIR);
239 
240 #ifdef DEV_PREFIX
241     prvar("DEV_PREFIX", DEV_PREFIX);
242 #else
243     prundefvar("DEV_PREFIX");
244 #endif
245 
246 #ifdef RDEV_PREFIX
247     prvar("RDEV_PREFIX", RDEV_PREFIX);
248 #else
249     prundefvar("RDEV_PREFIX");
250 #endif
251 
252 #ifdef DUMP
253     prvar("DUMP", DUMP);
254     prvar("RESTORE", RESTORE);
255 #else
256     prundefvar("DUMP");
257     prundefvar("RESTORE");
258 #endif
259 
260 #ifdef VDUMP
261     prvar("VDUMP", VDUMP);
262     prvar("VRESTORE", VRESTORE);
263 #else
264     prundefvar("VDUMP");
265     prundefvar("VRESTORE");
266 #endif
267 
268 #ifdef XFSDUMP
269     prvar("XFSDUMP", XFSDUMP);
270     prvar("XFSRESTORE", XFSRESTORE);
271 #else
272     prundefvar("XFSDUMP");
273     prundefvar("XFSRESTORE");
274 #endif
275 
276 #ifdef VXDUMP
277     prvar("VXDUMP", VXDUMP);
278     prvar("VXRESTORE", VXRESTORE);
279 #else
280     prundefvar("VXDUMP");
281     prundefvar("VXRESTORE");
282 #endif
283 
284 #ifdef SAMBA_CLIENT
285     prvar("SAMBA_CLIENT", SAMBA_CLIENT);
286 #else
287     prundefvar("SAMBA_CLIENT");
288 #endif
289 
290 #ifdef GNUTAR
291     prvar("GNUTAR", GNUTAR);
292 #else
293     prundefvar("GNUTAR");
294 #endif
295 
296 #ifdef COMPRESS_PATH
297     prvar("COMPRESS_PATH", COMPRESS_PATH);
298 #else
299     prundefvar("COMPRESS_PATH");
300 #endif
301 
302 #ifdef UNCOMPRESS_PATH
303     prvar("UNCOMPRESS_PATH", UNCOMPRESS_PATH);
304 #else
305     prundefvar("UNCOMPRESS_PATH");
306 #endif
307 
308 #ifdef LPRCMD
309     prvar("LPRCMD", LPRCMD);
310 #else
311     prundefvar(" LPRCMD");
312 #endif
313 
314 #ifdef MAILER
315     prvar("MAILER", MAILER);
316 #else
317     prundefvar(" MAILER");
318 #endif
319 
320 #ifdef GNUTAR_LISTED_INCREMENTAL_DIR
321     prvar("listed_incr_dir", GNUTAR_LISTED_INCREMENTAL_DIR);
322 #else
323     prundefvar("GNUTAR_LISTED_INCREMENTAL_DIR");
324 #endif
325     endline();
326 
327     startline("defs:");
328 
329     prvar("DEFAULT_SERVER", DEFAULT_SERVER);
330     prvar("DEFAULT_CONFIG", DEFAULT_CONFIG);
331     prvar("DEFAULT_TAPE_SERVER", DEFAULT_TAPE_SERVER);
332 
333 #ifdef DEFAULT_TAPE_DEVICE
334     prvar("DEFAULT_TAPE_DEVICE", DEFAULT_TAPE_DEVICE);
335 #endif
336 
337 #ifdef AIX_BACKUP
338     prstr("AIX_BACKUP");
339 #endif
340 
341 #ifdef BROKEN_VOID
342     prstr("BROKEN_VOID");
343 #endif
344 
345 #ifdef DUMP_RETURNS_1
346     prstr("DUMP_RETURNS_1");
347 #endif
348 
349 #ifdef HAVE_MMAP
350     prstr("HAVE_MMAP");
351 #endif
352 
353 #ifndef HAVE_STRERROR
354     prstr("NEED_STRERROR");
355 #endif
356 
357 #ifndef HAVE_STRSTR
358     prstr("NEED_STRSTR");
359 #endif
360 
361 #ifdef HAVE_SYSVSHM
362     prstr("HAVE_SYSVSHM");
363 #endif
364 
365 #ifdef WANT_AMFLOCK_POSIX
366     prstr("AMFLOCK_POSIX");
367 #endif
368 #ifdef WANT_AMFLOCK_FLOCK
369     prstr("AMFLOCK_FLOCK");
370 #endif
371 #ifdef WANT_AMFLOCK_LOCKF
372     prstr("AMFLOCK_LOCKF");
373 #endif
374 #ifdef WANT_AMFLOCK_LNLOCK
375     prstr("AMFLOCK_LNLOCK");
376 #endif
377 
378 #ifdef STATFS_BSD
379     prstr("STATFS_BSD");
380 #endif
381 
382 #ifdef STATFS_OSF1
383     prstr("STATFS_OSF1");
384 #endif
385 
386 #ifdef STATFS_ULTRIX
387     prstr("STATFS_ULTRIX");
388 #endif
389 
390 #ifdef SETPGRP_VOID
391     prstr("SETPGRP_VOID");
392 #endif
393 
394 #ifdef ASSERTIONS
395     prstr("ASSERTIONS");
396 #endif
397 
398 #ifdef AMANDA_DEBUG_DAYS
399     prnum("AMANDA_DEBUG_DAYS", AMANDA_DEBUG_DAYS);
400 #endif
401 
402 #ifdef BSD_SECURITY
403     prstr("BSD_SECURITY");
404 #endif
405 
406 #ifdef KRB5_SECURITY
407     prstr("KRB5_SECURITY");
408 #endif
409 
410 #ifdef RSH_SECURITY
411     prstr("RSH_SECURITY");
412 #endif
413 
414 #ifdef USE_AMANDAHOSTS
415     prstr("USE_AMANDAHOSTS");
416 #endif
417 
418 #ifdef USE_RUNDUMP
419     prstr("USE_RUNDUMP");
420 #endif
421 
422     prvar("CLIENT_LOGIN", CLIENT_LOGIN);
423 
424 #ifdef CHECK_USERID
425     prstr("CHECK_USERID");
426 #endif
427 
428 #ifdef HAVE_GZIP
429     prstr("HAVE_GZIP");
430 #endif
431 
432 #ifdef COMPRESS_SUFFIX
433     prvar("COMPRESS_SUFFIX", COMPRESS_SUFFIX);
434 #endif
435 
436 #ifdef COMPRESS_FAST_OPT
437     prvar("COMPRESS_FAST_OPT", COMPRESS_FAST_OPT);
438 #endif
439 
440 #ifdef COMPRESS_BEST_OPT
441     prvar("COMPRESS_BEST_OPT", COMPRESS_BEST_OPT);
442 #endif
443 
444 #ifdef UNCOMPRESS_OPT
445     prvar("UNCOMPRESS_OPT", UNCOMPRESS_OPT);
446 #endif
447 
448 #ifdef CONFIGURE_ARGS
449     prvar("CONFIGURE_ARGS", CONFIGURE_ARGS);
450 #endif
451 
452     endline();
453 
454     g_printf("  0\n};\n");
455 
456     return (0); /* exit */
457 }
458