static int elektraResolveUserPasswd (ElektraResolved * handle, Key * warningsKey) { char * dir = elektraResolvePasswd (warningsKey); if (!dir) return 0; elektraResolveUsingHome (handle, dir, 1); elektraFree (dir); return 1; }
static int elektraResolvePasswd (resolverHandle * p, Key * warningsKey) { struct passwd pwd; struct passwd * result; char * buf; ssize_t bufsize; int s; bufsize = sysconf (_SC_GETPW_R_SIZE_MAX); if (bufsize == -1) /* Value was indeterminate */ { bufsize = 16384; /* Should be more than enough */ } buf = elektraMalloc (bufsize); if (buf == NULL) { return 0; } s = getpwuid_r (getuid (), &pwd, buf, bufsize, &result); if (result == NULL) { elektraFree (buf); if (s != 0) { ELEKTRA_ADD_WARNING (90, warningsKey, strerror (s)); } return 0; } /* printf("Info: %s; UID: %ld0, Home: %s\n", pwd.pw_gecos, (long) pwd.pw_uid, pwd.pw_dir); */ elektraResolveUsingHome (p, pwd.pw_dir, true); elektraFree (buf); return 1; }
static int elektraResolveEnvHome (ElektraResolved * handle, Key * warningsKey) { const char * home = getenv ("HOME"); if (!home || !strcmp (home, "")) { return 0; } if (home[0] != '/') { ELEKTRA_ADD_WARNINGF (100, warningsKey, "HOME contains a path that is " "not absolute and thus " "it was skipped: %s", home); return 0; } elektraResolveUsingHome (handle, home, 1); return 1; }
static int elektraResolveUserXDGHome (ElektraResolved * handle, Key * warningsKey) { const char * home = getenv ("XDG_CONFIG_HOME"); if (!home || !strcmp (home, "")) { return 0; } if (home[0] != '/') { ELEKTRA_ADD_WARNINGF (100, warningsKey, "XDG_CONFIG_HOME contains a path that is " "not absolute (violates XDG specification) and thus " "it was skipped: %s", home); return 0; } elektraResolveUsingHome (handle, home, 0); return 1; }