/*
Este arquivo mostra as credenciais reais e efetivas de usuario
e de grupo do processo corrente (UID, EUID, GID, EGID).
maziero@inf.ufpr.br, 10/2026

1. compilar e executar normalmente

   gcc -Wall credentials.c -o credentials
   ./credentials

2. Mudar dono do arquivo executável para root e atribuir permissões
   para qualquer usuário poder executá-lo (rwx r-x r-x):

   sudo chown root:root ./credentials
   sudo chmod 755 ./credentials
   ./credentials

3. Atribuir flag SETUID ao executável

   sudo chmod u+s ./credentials
   ./credentials

3. Retirar flag SETUID e atribuir flag SETGID ao executável

   sudo chmod u-s ./credentials
   sudo chmod g+s ./credentials
   ./credentials

*/

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <grp.h>

int main ()
{
    int uid, euid, gid, egid ;
    struct passwd *pw ;
    struct group *gr ;

    // get process credentials
    uid  = getuid  () ;
    euid = geteuid () ;
    gid  = getgid  () ;
    egid = getegid () ;

    // print UID and its user name
    pw = getpwuid (uid) ;
    if (pw)
        printf ("UID  %d, user  name \"%s\"\n", uid, pw->pw_name) ;
    else
        printf ("UID  %d, user  name not found\n", uid) ;

    // print EUID and its user name
    pw = getpwuid (euid) ;
    if (pw)
        printf ("EUID %d, user  name \"%s\"\n", euid, pw->pw_name) ;
    else
        printf ("EUID %d, user  name not found\n", euid) ;

    // print GID and its group name
    gr = getgrgid (gid) ;
    if (gr)
        printf ("GID  %d, group name \"%s\"\n", gid, gr->gr_name) ;
    else
        printf ("GID  %d, group name not found\n", gid) ;

    // print EGID and its group name
    gr = getgrgid (egid) ;
    if (gr)
        printf ("EGID %d, group name \"%s\"\n", egid, gr->gr_name) ;
    else
        printf ("EGID %d, group name not found\n", egid) ;
}

