#define _GNU_SOURCE #include #include #include #include #include #include #include int strlcpy(char *restrict dest, const char *restrict src, size_t bufsize) { size_t i; for (i = 0; i < bufsize; ++i) { dest[i] = src[i]; if (src[i] == '\0') { return 0; } } return ERANGE; } char *getlogin(void) { return getenv("USER"); } int getlogin_r(char *buf, size_t bufsize) { const char *login = getlogin(); if (login == NULL) { return ENOENT; } return strlcpy(buf, login, bufsize); } struct passwd *getpwuid(uid_t uid) { struct passwd *(*getpwuid)(uid_t) = dlsym(RTLD_NEXT, "getpwuid"); if (getpwuid == NULL) { fprintf(stderr, "Unable to find the adress of the getpwuid function: %s\n", dlerror()); return NULL; } struct passwd *pass = getpwuid(uid); char *name = getenv("USER"); if (name == NULL) { fprintf(stderr, "Could not find the USER environment variable. Using the real username.\n"); return pass; } pass->pw_name = name; return pass; }