ファイヤープロジェクト
ユーザ情報
2003-07-20T15:13+09:00   matsu
ユーザ情報というと,アカウント名,uid,gidなどである.これらの情報が実際のプログラミングでどう使用されるのかは,ちょっとわからないが,取得できないよりはできるほうがいい.
uidやログイン名を取得するための関数は,getuid(),getlogin()である.これらで取得できる値は,そのプログラムを起動したユーザのuidやログイン名である.
また,指定したユーザのログイン名,uid,gid,ホームディレクトリ,デフォルトのシェルなどを格納した構造体passwdがある.以下,私のシステムの/usr/include/pwd.h.
struct passwd
{
  char *pw_name;                /* Username.  */
  char *pw_passwd;              /* Password.  */
  __uid_t pw_uid;               /* User ID.  */
  __gid_t pw_gid;               /* Group ID.  */
  char *pw_gecos;               /* Real name.  */
  char *pw_dir;                 /* Home directory.  */
  char *pw_shell;               /* Shell program.  */
};
pw_gecosは標準仕様がないらしい.ので,メンバ名がこれとは異なるシステムがある,らしい.passwd構造体はユーザidから取得するgetpwuid(uid_t uid)とログイン名から取得するgetpwnam(const char *name)がある.
/etc/passwdにはユーザ情報が書いてある.これをオープンして,読み込むこともできる(ハズ,試してない)が,もっと効率的にプログラミングするために上記のpasswd構造体やgetpwuidやgetpwnamがある.そして,/etc/passwdを走査するための関数としてsetpwent,getpwent,endpwentがある.setしてgetしてendする.
上に出て来た関数を使用するサンプルを以下に示す.
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <pwd.h>

int main()
{
  struct passwd *pw;

  /* getuid()でuidを取得 */
  fprintf(stdout,"UID=%d\n",getuid());

  /* getlogin()でログイン名を取得 */
  fprintf(stdout,"LOGIN NAME=%s\n",getlogin());

  fprintf(stdout,"=============================================\n");

  /* getpwuid(uid_t uid)でuidからpasswd構造体を取得 */
  pw=getpwuid(6);
  /* passwd構造体の各メンバを表示 */
  fprintf(stdout,"LOGIN NAME=%s\n",pw->pw_name);
  fprintf(stdout,"UID=%d\n",pw->pw_uid);
  fprintf(stdout,"GID=%d\n",pw->pw_gid);
  fprintf(stdout,"$HOME=%s\n",pw->pw_dir);
  fprintf(stdout,"Default shell=%s\n",pw->pw_shell);

  fprintf(stdout,"=============================================\n");

  /* getpwnam(const char *name)でログイン名からpasswd構造体を取得 */
  pw=getpwnam("nobody");
  /* passwd構造体の各メンバを表示 */
  fprintf(stdout,"LOGIN NAME=%s\n",pw->pw_name);
  fprintf(stdout,"UID=%d\n",pw->pw_uid);
  fprintf(stdout,"GID=%d\n",pw->pw_gid);
  fprintf(stdout,"$HOME=%s\n",pw->pw_dir);
  fprintf(stdout,"Default shell=%s\n",pw->pw_shell);

  fprintf(stdout,"=============================================\n");

  /* パスワードファイルから全エントリを順次取り出す. */
  fprintf(stdout,"NAME\tUID\tGID\t$HOME\t\tDefaultShell\n");
  /* パスワードファイル内の位置を設定 */
  setpwent();
  /* getpwent()でパスワードファイル内のエントリからpasswd構造体を取得 */
  while((pw=getpwent())!=NULL){
    /* passwd構造体の各メンバを表示 */
    fprintf(stdout,"%s\t",pw->pw_name);
    fprintf(stdout,"%d\t",pw->pw_uid);
    fprintf(stdout,"%d\t",pw->pw_gid);
    fprintf(stdout,"%s\t\t",pw->pw_dir);
    fprintf(stdout,"%s\n",pw->pw_shell);
  }
  /* endpwent()で終了処理 */
  endpwent();

  exit(0);
}
実行結果は省略.
matsu(C)
Since 2002
Mail to matsu