1ea7d43d0SAvi Kivity #include "libcflat.h" 26b97d595SAndrew Jones #include "auxinfo.h" 3ea7d43d0SAvi Kivity 4ea7d43d0SAvi Kivity int __argc; 5ea7d43d0SAvi Kivity char *__args; 6*69205bf1SAndrew Jones char *__argv[100]; 7*69205bf1SAndrew Jones char *__environ[200]; 8*69205bf1SAndrew Jones 9*69205bf1SAndrew Jones char **environ = __environ; 106b97d595SAndrew Jones 116b97d595SAndrew Jones static char args_copy[1000]; 126b97d595SAndrew Jones static char *copy_ptr = args_copy; 13ea7d43d0SAvi Kivity 144bc666caSAndrew Jones #define isblank(c) ((c) == ' ' || (c) == '\t') 15*69205bf1SAndrew Jones #define isalpha(c) (((c) >= 'A' && (c) <= 'Z') || ((c) >= 'a' && (c) <= 'z') || (c) == '_') 16*69205bf1SAndrew Jones #define isalnum(c) (isalpha(c) || ((c) >= '0' && (c) <= '9')) 17ea7d43d0SAvi Kivity 18ea7d43d0SAvi Kivity static char *skip_blanks(char *p) 19ea7d43d0SAvi Kivity { 20ea7d43d0SAvi Kivity while (isblank(*p)) 21ea7d43d0SAvi Kivity ++p; 22ea7d43d0SAvi Kivity return p; 23ea7d43d0SAvi Kivity } 24ea7d43d0SAvi Kivity 25ea7d43d0SAvi Kivity void __setup_args(void) 26ea7d43d0SAvi Kivity { 27ea7d43d0SAvi Kivity char *args = __args; 286b97d595SAndrew Jones char **argv = __argv + __argc; 29ea7d43d0SAvi Kivity 30ea7d43d0SAvi Kivity while (*(args = skip_blanks(args)) != '\0') { 316b97d595SAndrew Jones *argv++ = copy_ptr; 32ea7d43d0SAvi Kivity while (*args != '\0' && !isblank(*args)) 336b97d595SAndrew Jones *copy_ptr++ = *args++; 346b97d595SAndrew Jones *copy_ptr++ = '\0'; 35ea7d43d0SAvi Kivity } 36ea7d43d0SAvi Kivity __argc = argv - __argv; 37ea7d43d0SAvi Kivity } 385e61cba0SAndrew Jones 395e61cba0SAndrew Jones void setup_args(char *args) 405e61cba0SAndrew Jones { 415e61cba0SAndrew Jones if (!args) 425e61cba0SAndrew Jones return; 435e61cba0SAndrew Jones 445e61cba0SAndrew Jones __args = args; 455e61cba0SAndrew Jones __setup_args(); 465e61cba0SAndrew Jones } 476ffea954SAndrew Jones 48809ebcb3SAndrew Jones void setup_args_progname(char *args) 496ffea954SAndrew Jones { 506b97d595SAndrew Jones __argv[0] = copy_ptr; 51809ebcb3SAndrew Jones strcpy(__argv[0], auxinfo.progname); 52809ebcb3SAndrew Jones copy_ptr += strlen(auxinfo.progname) + 1; 536b97d595SAndrew Jones ++__argc; 546ffea954SAndrew Jones if (args) { 556ffea954SAndrew Jones __args = args; 566ffea954SAndrew Jones __setup_args(); 576ffea954SAndrew Jones } 586ffea954SAndrew Jones } 59*69205bf1SAndrew Jones 60*69205bf1SAndrew Jones static char *env_eol(char *env) 61*69205bf1SAndrew Jones { 62*69205bf1SAndrew Jones while (*env && *env != '\n') 63*69205bf1SAndrew Jones ++env; 64*69205bf1SAndrew Jones return env; 65*69205bf1SAndrew Jones } 66*69205bf1SAndrew Jones 67*69205bf1SAndrew Jones static char *env_invalid_eol(char *env) 68*69205bf1SAndrew Jones { 69*69205bf1SAndrew Jones char *eol = env_eol(env); 70*69205bf1SAndrew Jones char eol_old = *eol; 71*69205bf1SAndrew Jones 72*69205bf1SAndrew Jones *eol = '\0'; 73*69205bf1SAndrew Jones printf("Invalid environment variable: %s\n", env); 74*69205bf1SAndrew Jones *eol = eol_old; 75*69205bf1SAndrew Jones return eol; 76*69205bf1SAndrew Jones } 77*69205bf1SAndrew Jones 78*69205bf1SAndrew Jones static char *env_next(char *env) 79*69205bf1SAndrew Jones { 80*69205bf1SAndrew Jones char *p; 81*69205bf1SAndrew Jones 82*69205bf1SAndrew Jones if (!*env) 83*69205bf1SAndrew Jones return env; 84*69205bf1SAndrew Jones 85*69205bf1SAndrew Jones if (isalpha(*env)) { 86*69205bf1SAndrew Jones bool invalid = false; 87*69205bf1SAndrew Jones 88*69205bf1SAndrew Jones p = env + 1; 89*69205bf1SAndrew Jones while (*p && *p != '=' && *p != '\n') { 90*69205bf1SAndrew Jones if (!isalnum(*p)) 91*69205bf1SAndrew Jones invalid = true; 92*69205bf1SAndrew Jones ++p; 93*69205bf1SAndrew Jones } 94*69205bf1SAndrew Jones 95*69205bf1SAndrew Jones if (*p != '=') 96*69205bf1SAndrew Jones invalid = true; 97*69205bf1SAndrew Jones 98*69205bf1SAndrew Jones if (invalid) { 99*69205bf1SAndrew Jones env = env_invalid_eol(env); 100*69205bf1SAndrew Jones return *env ? env_next(env + 1) : env; 101*69205bf1SAndrew Jones } 102*69205bf1SAndrew Jones return env; 103*69205bf1SAndrew Jones } 104*69205bf1SAndrew Jones 105*69205bf1SAndrew Jones p = env; 106*69205bf1SAndrew Jones while (isblank(*p)) 107*69205bf1SAndrew Jones ++p; 108*69205bf1SAndrew Jones 109*69205bf1SAndrew Jones if (*p == '\n') 110*69205bf1SAndrew Jones return env_next(p + 1); 111*69205bf1SAndrew Jones 112*69205bf1SAndrew Jones if (*p == '#') 113*69205bf1SAndrew Jones env = env_eol(env); 114*69205bf1SAndrew Jones else 115*69205bf1SAndrew Jones env = env_invalid_eol(env); 116*69205bf1SAndrew Jones 117*69205bf1SAndrew Jones return *env ? env_next(env + 1) : env; 118*69205bf1SAndrew Jones } 119*69205bf1SAndrew Jones 120*69205bf1SAndrew Jones void setup_env(char *env, int size) 121*69205bf1SAndrew Jones { 122*69205bf1SAndrew Jones char *eof = env + size, *p = env; 123*69205bf1SAndrew Jones bool newline = false; 124*69205bf1SAndrew Jones int i = 0; 125*69205bf1SAndrew Jones 126*69205bf1SAndrew Jones while (*p) 127*69205bf1SAndrew Jones ++p; 128*69205bf1SAndrew Jones if (p == eof) 129*69205bf1SAndrew Jones newline = true; 130*69205bf1SAndrew Jones 131*69205bf1SAndrew Jones while (env < eof) { 132*69205bf1SAndrew Jones if (newline) 133*69205bf1SAndrew Jones env = env_next(env); 134*69205bf1SAndrew Jones if (!*env || env >= eof) 135*69205bf1SAndrew Jones break; 136*69205bf1SAndrew Jones __environ[i++] = env; 137*69205bf1SAndrew Jones while (env < eof && *env && !(newline && *env == '\n')) 138*69205bf1SAndrew Jones ++env; 139*69205bf1SAndrew Jones *env++ = '\0'; 140*69205bf1SAndrew Jones } 141*69205bf1SAndrew Jones } 142