xref: /freebsd/tools/regression/environ/envctl.c (revision 9bab236702b4f33a990011b08a2deebbb8ea6e0c)
12966d28cSSean Farley /*-
22966d28cSSean Farley  * Copyright (c) 2007 Sean C. Farley <scf@FreeBSD.org>
32966d28cSSean Farley  * All rights reserved.
42966d28cSSean Farley  *
52966d28cSSean Farley  * Redistribution and use in source and binary forms, with or without
62966d28cSSean Farley  * modification, are permitted provided that the following conditions
72966d28cSSean Farley  * are met:
82966d28cSSean Farley  * 1. Redistributions of source code must retain the above copyright
92966d28cSSean Farley  *    notice, this list of conditions and the following disclaimer,
102966d28cSSean Farley  *    without modification, immediately at the beginning of the file.
112966d28cSSean Farley  * 2. Redistributions in binary form must reproduce the above copyright
122966d28cSSean Farley  *    notice, this list of conditions and the following disclaimer in the
132966d28cSSean Farley  *    documentation and/or other materials provided with the distribution.
142966d28cSSean Farley  *
152966d28cSSean Farley  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
162966d28cSSean Farley  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
172966d28cSSean Farley  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
182966d28cSSean Farley  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
192966d28cSSean Farley  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
202966d28cSSean Farley  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
212966d28cSSean Farley  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
222966d28cSSean Farley  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
232966d28cSSean Farley  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
242966d28cSSean Farley  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
252966d28cSSean Farley  */
262966d28cSSean Farley #include <errno.h>
272966d28cSSean Farley #include <libgen.h>
282966d28cSSean Farley #include <stdbool.h>
292966d28cSSean Farley #include <stdio.h>
302966d28cSSean Farley #include <stdlib.h>
312966d28cSSean Farley #include <string.h>
322966d28cSSean Farley #include <unistd.h>
332966d28cSSean Farley 
342966d28cSSean Farley 
352966d28cSSean Farley #include <sys/cdefs.h>
362966d28cSSean Farley __FBSDID("$FreeBSD$");
372966d28cSSean Farley 
382966d28cSSean Farley 
392966d28cSSean Farley extern char **environ;
402966d28cSSean Farley 
412966d28cSSean Farley 
422966d28cSSean Farley static void
432966d28cSSean Farley dump_environ(void)
442966d28cSSean Farley {
452966d28cSSean Farley 	char **environPtr;
462966d28cSSean Farley 
472966d28cSSean Farley 	for (environPtr = environ; *environPtr != NULL; *environPtr++)
482966d28cSSean Farley 		printf("%s\n", *environPtr);
492966d28cSSean Farley 
502966d28cSSean Farley 	return;
512966d28cSSean Farley }
522966d28cSSean Farley 
532966d28cSSean Farley 
542966d28cSSean Farley static void
552966d28cSSean Farley usage(const char *program)
562966d28cSSean Farley {
579bab2367SSean Farley 	fprintf(stderr, "Usage:  %s [-CDGUchrt] [-gu name] [-p name=value] "
582966d28cSSean Farley 	    "[(-S|-s name) value overwrite]\n\n"
592966d28cSSean Farley 	    "Options:\n"
609bab2367SSean Farley 	    "  -C\t\t\t\tClear environ variable with NULL pointer\n"
612966d28cSSean Farley 	    "  -D\t\t\t\tDump environ\n"
622966d28cSSean Farley 	    "  -G name\t\t\tgetenv(NULL)\n"
632966d28cSSean Farley 	    "  -S value overwrite\t\tsetenv(NULL, value, overwrite)\n"
642966d28cSSean Farley 	    "  -U\t\t\t\tunsetenv(NULL)\n"
659bab2367SSean Farley 	    "  -c\t\t\t\tClear environ variable with calloc()'d memory\n"
662966d28cSSean Farley 	    "  -g name\t\t\tgetenv(name)\n"
672966d28cSSean Farley 	    "  -h\t\t\t\tHelp\n"
682966d28cSSean Farley 	    "  -p name=value\t\t\tputenv(name=value)\n"
699bab2367SSean Farley 	    "  -r\t\t\t\treplace environ with { \"FOO=bar\", NULL }\n"
702966d28cSSean Farley 	    "  -s name value overwrite\tsetenv(name, value, overwrite)\n"
712966d28cSSean Farley 	    "  -t\t\t\t\tOutput is suitable for testing (no newlines)\n"
722966d28cSSean Farley 	    "  -u name\t\t\tunsetenv(name)\n",
732966d28cSSean Farley 	    basename(program));
742966d28cSSean Farley 
752966d28cSSean Farley 	return;
762966d28cSSean Farley }
772966d28cSSean Farley 
782966d28cSSean Farley 
792966d28cSSean Farley int
802966d28cSSean Farley main(int argc, char **argv)
812966d28cSSean Farley {
829bab2367SSean Farley 	char *staticEnv[] = { "FOO=bar", NULL };
832966d28cSSean Farley 	char arg;
842966d28cSSean Farley 	const char *eol = "\n";
852966d28cSSean Farley 	const char *value;
862966d28cSSean Farley 
872966d28cSSean Farley 	if (argc == 1) {
882966d28cSSean Farley 		usage(argv[0]);
892966d28cSSean Farley 		exit(EXIT_FAILURE);
902966d28cSSean Farley 	}
912966d28cSSean Farley 
929bab2367SSean Farley 	while ((arg = getopt(argc, argv, "CDGS:Ucg:hp:rs:tu:")) != -1) {
932966d28cSSean Farley 		switch (arg) {
949bab2367SSean Farley 			case 'C':
959bab2367SSean Farley 				environ = NULL;
962966d28cSSean Farley 				break;
972966d28cSSean Farley 
982966d28cSSean Farley 			case 'c':
999bab2367SSean Farley 				environ = calloc(1, sizeof(*environ));
1009bab2367SSean Farley 				break;
1019bab2367SSean Farley 
1029bab2367SSean Farley 			case 'D':
1039bab2367SSean Farley 				errno = 0;
1049bab2367SSean Farley 				dump_environ();
1052966d28cSSean Farley 				break;
1062966d28cSSean Farley 
1072966d28cSSean Farley 			case 'G':
1082966d28cSSean Farley 				value = getenv(NULL);
1092966d28cSSean Farley 				printf("%s%s", value == NULL ? "" : value, eol);
1102966d28cSSean Farley 				break;
1112966d28cSSean Farley 
1122966d28cSSean Farley 			case 'g':
1132966d28cSSean Farley 				value = getenv(optarg);
1142966d28cSSean Farley 				printf("%s%s", value == NULL ? "" : value, eol);
1152966d28cSSean Farley 				break;
1162966d28cSSean Farley 
1172966d28cSSean Farley 			case 'p':
1182966d28cSSean Farley 				errno = 0;
1192966d28cSSean Farley 				printf("%d %d%s", putenv(optarg), errno, eol);
1202966d28cSSean Farley 				break;
1212966d28cSSean Farley 
1229bab2367SSean Farley 			case 'r':
1239bab2367SSean Farley 				environ = staticEnv;
1249bab2367SSean Farley 				break;
1259bab2367SSean Farley 
1262966d28cSSean Farley 			case 'S':
1272966d28cSSean Farley 				errno = 0;
1282966d28cSSean Farley 				printf("%d %d%s", setenv(NULL, optarg,
1292966d28cSSean Farley 				    atoi(argv[optind])), errno, eol);
1302966d28cSSean Farley 				optind += 1;
1312966d28cSSean Farley 				break;
1322966d28cSSean Farley 
1332966d28cSSean Farley 			case 's':
1342966d28cSSean Farley 				errno = 0;
1352966d28cSSean Farley 				printf("%d %d%s", setenv(optarg, argv[optind],
1362966d28cSSean Farley 				    atoi(argv[optind + 1])), errno, eol);
1372966d28cSSean Farley 				optind += 2;
1382966d28cSSean Farley 				break;
1392966d28cSSean Farley 
1402966d28cSSean Farley 			case 't':
1412966d28cSSean Farley 				eol = " ";
1422966d28cSSean Farley 				break;
1432966d28cSSean Farley 
1442966d28cSSean Farley 			case 'U':
1452966d28cSSean Farley 				printf("%d %d%s", unsetenv(NULL), errno, eol);
1462966d28cSSean Farley 				break;
1472966d28cSSean Farley 
1482966d28cSSean Farley 			case 'u':
1492966d28cSSean Farley 				printf("%d %d%s", unsetenv(optarg), errno, eol);
1502966d28cSSean Farley 				break;
1512966d28cSSean Farley 
1522966d28cSSean Farley 			case 'h':
1532966d28cSSean Farley 			default:
1542966d28cSSean Farley 				usage(argv[0]);
1552966d28cSSean Farley 				exit(EXIT_FAILURE);
1562966d28cSSean Farley 		}
1572966d28cSSean Farley 	}
1582966d28cSSean Farley 
1592966d28cSSean Farley 	// Output a closing newline in test mode.
1602966d28cSSean Farley 	if (eol[0] == ' ')
1612966d28cSSean Farley 		printf("\n");
1622966d28cSSean Farley 
1632966d28cSSean Farley 	return (EXIT_SUCCESS);
1642966d28cSSean Farley }
165