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