トップ «前の日記(2007-03-21) 最新 次の日記(2007-03-23)» 編集

ヨタの日々

2001|08|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|12|
2024|01|02|03|04|

2007-03-22 :-)

_ [写経][UNIX][NetBSD][プログラミング]詳解 UNIX プログラミング写経

WindowsXP 上の VMWare 上の NetBSD

プログラム 4.1

stat() lstat() の使い方です。プログラムに渡した pathname の stat を取得して st_mode を印字します。

#include <sys/types.h>
#include <sys/stat.h>

int main( int ac, char** av )
{
  int i;
  struct stat buf;
  char* ptr;

  for( i = 1; i < ac; i++ )
    {
      printf( "%s: ", av[ i ] );
      if( lstat( av[ i ], &buf ) < 0 )
        {
          err( "lstat error");
          continue;
        }

      if( S_ISREG( buf.st_mode ) )        ptr = "regular";
      else if( S_ISDIR( buf.st_mode ) )   ptr = "directory";
      else if( S_ISCHR( buf.st_mode ) )   ptr = "character special";
      else if( S_ISBLK( buf.st_mode ) )   ptr = "block special";
      else if( S_ISFIFO( buf.st_mode ) )  ptr = "fifo";
#ifdef S_ISLNK
      else if( S_ISLNK( buf.st_mode ) ) ptr = "symbolic link";
#endif
#ifdef S_ISSOCK
      else if( S_ISSOCK( buf.st_mode ) )  ptr = "socket";
#endif
      else ptr = "** unknown mode **";

      printf( "%s\n", ptr );
    }

  return 0;
}

find(1) の -type p で同じことが出来るんですね。

-type t
 True if the file is of the specified type.  Possible file types
 are as follows:

   b     block special
   c     character special
   d     directory
   f     regular file
   l     symbolic link
   p     FIFO
   s     socket
   W     whiteout
   w     whiteout

FIFO を探そうとしてみたけど手元に無いみたいです。

% find /usr -type p
find: /usr/games/hide: Permission denied
% find /etc -type p
%

_ [写経][UNIX][NetBSD][access][プログラミング]詳解 UNIX プログラミング写経

WindowsXP 上の VMWare 上の NetBSD

プログラム 4.2

実ユーザ ID と実効ユーザ ID について説明しています。open() は実効ユーザ ID を検査して、access() は実ユーザ ID を検査します。err() だとそのままプロセスが終了してしまうので warn() を使いました。

#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>

int main( int ac, char** av )
{
  if( ac != 2 )
    {
      printf( "usage: a.out <pathname>\n" );
      exit(1);
    }
  if( access( av[ 1 ], R_OK ) < 0 )
    warn( "access error" );
  else
    printf( "read access OK\n" );

  if( open( av[ 1 ], O_RDONLY ) < 0 )
    warn( "open error" );
  else
    printf( "open for reading OK\n" );

  return 0;
}

a.out にたいして実行してみます。

% ls -l a.out
-rwxr-xr-x  1 rin  users  6302 Mar 21 02:19:49 2007 a.out*
% ./a.out a.out
read access OK  ← access() は成功する
open for reading OK  ← open() は成功する

/var/cron/log にたいして実行してみます。

% ls -l /var/cron/log
-rw-------  1 root  wheel  2355 Mar 21 02:20:10 2007 /var/cron/log
% sudo chown root a.out
% sudo chmod u+s a.out   ←セットユーザ ID ビットをセット
% ./a.out /var/cron/log
a.out: access error: Permission denied  ← access() は失敗する
open for reading OK  ← open() は成功する

実効ユーザ ID はこのように使うのですね。

_ [rc][UNIX][写経][プログラミング][NetBSD]詳解 UNIX プログラミング写経

WindowsXP 上の VMWare 上の NetBSD

プログラム 4.3

umask() を使います。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main( int ac, char** av )
{
  umask( 0 );
  if( creat( "foo",
             S_IRUSR | S_IWUSR |
             S_IRGRP | S_IWGRP |
             S_IROTH | S_IWOTH ) < 0 )
    err( 1, "creat error foo" );

  umask( S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH );

  if( creat( "bar",
             S_IRUSR | S_IWUSR |
             S_IRGRP | S_IWGRP |
             S_IROTH | S_IWOTH ) < 0 )
    err( 1, "creat error bar" );

  return 0;
}
% umask  ←現在のファイルモード作成マスクを表示
022
% ./a.out
% ls -l foo bar
-rw-------  1 rin  users  0 Mar 21 02:45:23 2007 bar
-rw-rw-rw-  1 rin  users  0 Mar 21 02:45:23 2007 foo
% umask
022  ← ファイルモード作成マスクは変更されてない

ほとんどの UNIX ユーザは、設定してある umask の値に関心を持っていない。通常、ログイン時にシェルの起動ファイルで設定され、以降変更しない。( p.80 )

ログイン時に設定される umask は /etc/rc に書いてあるこれです。だと思います。

export HOME=/
export PATH=/sbin:/bin:/usr/sbin:/usr/bin
umask 022

/etc/rc から起動されるプロセスは /etc/rc で umask 022 に設定されるということでしょうか。たとえば ssh ログインするときは /etc/rc から起動された sshd へ umask を引き継ぎます。たぶん。telnet ログインするときはたとえば inetd から起動された telnetd へ umask が引き継がれるわけですね。たぶん。

ref. rc.d System

_ [FF12]FF12

プレイ時間 83:37

  • ワイルドモルボル討伐
  • ピスコディーモン討伐
  • クランランク「ナイツオブラウンド」になった

_ [][豚の角煮][ホットサラダ]飯

豚の角煮、ホットサラダ。

img_3468.jpg

_ [クッキー][おやつ]おやつ

ぃゃね、あいかわらずクッキーに挑戦してるんですけどね、なんだか別の物体が出来たというか大きいのかしら。もうね、ほんとに挫けそうです (´ω` )

img_3470.jpg

本日のツッコミ(全2件) [ツッコミを入れる]
_ ろみたん (2007-03-23 09:45)

umask の値が気にいらない、と最初に気づいた時に<br>~/.ほげrc に設定したら、その後は気にしてないなぁ…

_ みわ (2007-03-25 00:30)

ろみんた!<br>umask はいままで気にしてかなったす。grep umask ~/.* しても umask を設定してるところが無かった笑 なので /etc 以下を探したわけでした。ろみたんは umask をいくつにしてますか。