domenica 13 maggio 2012

Ottenere lo username e il nome del gruppo principale in Linux

Seppur semplice e scontato, riporto qui un pezzo di codice C che consente la scoperta dello username dell'utente che sta attualmente eseguendo l'applicazione e l'ottenimento del nome del primo gruppo a cui l'utente appartiene:

QString getUsername()

  // get the data about the user using the getpwuid(2) system call
  uid_t  currentUID_t   = getuid();
  struct passwd *st_pwd = getpwuid( currentUID_t );
 
 
  if( st_pwd != NULL )
    // convert the string with the username into a "good" string
    return QString::fromLatin1( st_pwd->pw_name );
  else
    // error !
    return QString::number( currentUID_t );
}


QString getGroupname()

  // get the data about the user using the getpwuid(2) system call
  uid_t  currentUID_t   = getuid();
  struct passwd *st_pwd = getpwuid( currentUID_t );
  gid_t currentGID_t     = getgid();
 
  int ngroups = 1;      // number of groups to be retrieved
  gid_t *st_groups;
  st_groups = (gid_t*) malloc( sizeof( gid_t ) * ngroups );
  getgrouplist( st_pwd->pw_name,
                currentGID_t,
                st_groups,
                &ngroups
  );
 
 
  if( st_groups != NULL ){
    // convert the string with the username into a "good" string
    group* groupID = getgrgid( st_groups[0] );
    return QString::fromLatin1( groupID->gr_name );
  }
  else
    // error !
    return QString::number( currentGID_t );
}


Le due funzioni restituiscono entrambe un oggetto QString che può quindi essere utilizzato in una applicazione Qt/KDE. Nel caso particolare di KDE conviene invece utilizzare l'oggetto di libreria KUser che alla sua creazione effettua autonomamente l'aggancio allo username e alla lista dei gruppi:

KUser user;
user.loginName();
user.groupNames().at( 0 );




Nessun commento: