static char *GetEnv(const char *variable) { #ifdef _WIN32_WCE return NULL; #else #ifdef WIN32 char env[MAX_PATH]; /* MAX_PATH is from windef.h */ char *temp; env[0] = '\0'; //We can not get access to env vars from app's sandbox #ifndef OS_WP8 *temp = getenv(variable); if(temp != NULL) ExpandEnvironmentStringsA(temp, env, sizeof(env)); #endif return (env[0] != '\0')?strdup(env):NULL; #else char *env = getenv(variable); #ifdef VMS if(env && strcmp("HOME",variable) == 0) env = decc_translate_vms(env); #endif return (env && env[0])?strdup(env):NULL; #endif #endif }
static char *GetEnv(const char *variable) { #ifdef _WIN32_WCE return NULL; #else #ifdef WIN32 char env[MAX_PATH]; /* MAX_PATH is from windef.h */ char *temp = getenv(variable); env[0] = '\0'; if(temp != NULL) ExpandEnvironmentStrings(temp, env, sizeof(env)); return (env[0] != '\0')?strdup(env):NULL; #else char *env = getenv(variable); #ifdef __VMS if(env && strcmp("HOME",variable) == 0) env = decc_translate_vms(env); #endif return (env && env[0])?strdup(env):NULL; #endif #endif }
/* return the home directory of the current user as an allocated string */ char *homedir(void) { char *home; home = GetEnv("CURL_HOME", FALSE); if(home) return home; home = GetEnv("HOME", FALSE); if(home) return home; #if defined(HAVE_GETPWUID) && defined(HAVE_GETEUID) { struct passwd *pw = getpwuid(geteuid()); if(pw) { #ifdef __VMS home = decc_translate_vms(pw->pw_dir); #else home = pw->pw_dir; #endif if(home && home[0]) home = strdup(home); else home = NULL; } } #endif /* PWD-stuff */ #ifdef WIN32 home = GetEnv("APPDATA", TRUE); if(!home) home = GetEnv("%USERPROFILE%\\Application Data", TRUE); /* Normally only on Win-2K/XP */ #endif /* WIN32 */ return home; }
static char *GetEnv(const char *variable, char do_expand) { char *env = NULL; #ifdef WIN32 char buf1[1024], buf2[1024]; DWORD rc; /* Don't use getenv(); it doesn't find variable added after program was * started. Don't accept truncated results (i.e. rc >= sizeof(buf1)). */ rc = GetEnvironmentVariable(variable, buf1, sizeof(buf1)); if (rc > 0 && rc < sizeof(buf1)) { env = buf1; variable = buf1; } if (do_expand && strchr(variable,'%')) { /* buf2 == variable if not expanded */ rc = ExpandEnvironmentStrings (variable, buf2, sizeof(buf2)); if (rc > 0 && rc < sizeof(buf2) && !strchr(buf2,'%')) /* no vars still unexpanded */ env = buf2; } #else (void)do_expand; #ifdef __VMS env = getenv(variable); if (env && strcmp("HOME",variable) == 0) { env = decc_translate_vms(env); } #else /* no length control */ env = getenv(variable); #endif #endif return (env && env[0])?strdup(env):NULL; }
/* * @unittest: 1304 */ int Curl_parsenetrc(const char *host, char *login, char *password, char *netrcfile) { FILE *file; int retcode=1; int specific_login = (login[0] != 0); char *home = NULL; bool home_alloc = FALSE; bool netrc_alloc = FALSE; enum host_lookup_state state=NOTHING; char state_login=0; /* Found a login keyword */ char state_password=0; /* Found a password keyword */ int state_our_login=FALSE; /* With specific_login, found *our* login name */ #define NETRC DOT_CHAR "netrc" if(!netrcfile) { home = curl_getenv("HOME"); /* portable environment reader */ if(home) { home_alloc = TRUE; #if defined(HAVE_GETPWUID) && defined(HAVE_GETEUID) } else { struct passwd *pw; pw= getpwuid(geteuid()); if(pw) { #ifdef __VMS home = decc_translate_vms(pw->pw_dir); #else home = pw->pw_dir; #endif } #endif } if(!home) return -1; netrcfile = curl_maprintf("%s%s%s", home, DIR_CHAR, NETRC); if(!netrcfile) { if(home_alloc) free(home); return -1; } netrc_alloc = TRUE; } file = fopen(netrcfile, "r"); if(file) { char *tok; char *tok_buf; bool done=FALSE; char netrcbuffer[256]; int netrcbuffsize = (int)sizeof(netrcbuffer); while(!done && fgets(netrcbuffer, netrcbuffsize, file)) { tok=strtok_r(netrcbuffer, " \t\n", &tok_buf); while(!done && tok) { if(login[0] && password[0]) { done=TRUE; break; } switch(state) { case NOTHING: if(Curl_raw_equal("machine", tok)) { /* the next tok is the machine name, this is in itself the delimiter that starts the stuff entered for this machine, after this we need to search for 'login' and 'password'. */ state=HOSTFOUND; } break; case HOSTFOUND: if(Curl_raw_equal(host, tok)) { /* and yes, this is our host! */ state=HOSTVALID; retcode=0; /* we did find our host */ } else /* not our host */ state=NOTHING; break; case HOSTVALID: /* we are now parsing sub-keywords concerning "our" host */ if(state_login) { if(specific_login) { state_our_login = Curl_raw_equal(login, tok); } else { strncpy(login, tok, LOGINSIZE-1); } state_login=0; } else if(state_password) { if(state_our_login || !specific_login) { strncpy(password, tok, PASSWORDSIZE-1); } state_password=0; } else if(Curl_raw_equal("login", tok)) state_login=1; else if(Curl_raw_equal("password", tok)) state_password=1; else if(Curl_raw_equal("machine", tok)) { /* ok, there's machine here go => */ state = HOSTFOUND; state_our_login = FALSE; } break; } /* switch (state) */ tok = strtok_r(NULL, " \t\n", &tok_buf); } /* while(tok) */ } /* while fgets() */ fclose(file); } if(home_alloc) free(home); if(netrc_alloc) free(netrcfile); return retcode; }