/* Example for process user-IDs Don't forget to make the resulting binary setuid by executing chmod u+s binaryname where 'binaryname' is the name of the binary produced by your compiler. To see something interesting, run the program from a user account different from the owner of the binary. */ #include #include #include #include #include /* get real user-ID -- who's running us? */ void printruid(){ uid_t uid; struct passwd *usrInfo; uid = getuid(); usrInfo = getpwuid(uid); if (usrInfo != NULL) { printf("Real uid: %s\n", usrInfo->pw_name); } } /* get effective user-ID -- what privilege do we have? */ void printeuid(){ uid_t uid; struct passwd *usrInfo; uid = geteuid(); usrInfo = getpwuid(uid); if (usrInfo != NULL) { printf("Effective uid: %s\n", usrInfo->pw_name); } } int main(int argc, char **argv){ int result; uid_t realuid, saveduid; realuid = getuid(); saveduid = geteuid(); printruid(); printeuid(); printf("\n"); /* Change uid to real uid */ if (seteuid(realuid) != -1) { printf("\nChanged euid to ruid\n"); } else { printf("\nError when changing euid to ruid: %s\n", strerror(errno)); } printruid(); printeuid(); printf("\n"); /* Change uid to saved uid */ if (seteuid(saveduid) != -1) { printf("\nChanged euid to saved uid\n"); } else { printf("\nError when changing euid to saved uid: %s\n", strerror(errno)); } printeuid(); return 0; }