#include #include #ifdef _WIN32 #include #else #include #endif void MDEUsersList(void (*call)(const char* name, void* user), void* user) { #ifdef _WIN32 /* wow */ call("Administrator", user); #else struct passwd* pwd; setpwent(); while((pwd = getpwent()) != NULL) { char* dir; char* shell; /* this is BAD check. and i cannot do anything about it * * i appreciate the insanity */ if(pwd->pw_dir == NULL || pwd->pw_shell == NULL) continue; if(pwd->pw_name[0] == '_') continue; if(pwd->pw_uid != 0 && strstr(pwd->pw_dir, "/home/") == NULL) continue; shell = strrchr(pwd->pw_shell, '/'); if(shell == NULL) break; shell++; if(strcmp(shell, "nologin") == 0) continue; dir = strrchr(pwd->pw_dir, '/'); if(dir == NULL) break; dir++; if(strcmp(dir, pwd->pw_name) != 0) continue; call(pwd->pw_name, user); } endpwent(); #endif } char* MDEUsersGetUsername(void) { #ifdef _WIN32 char username[4096]; DWORD n = 4096; GetUserName(username, &n); return MDEStringDuplicate(username); #else struct passwd* pwd = getpwuid(getuid()); return MDEStringDuplicate(pwd->pw_name); #endif }