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
umask の値が気にいらない、と最初に気づいた時に<br>~/.ほげrc に設定したら、その後は気にしてないなぁ…
ろみんた!<br>umask はいままで気にしてかなったす。grep umask ~/.* しても umask を設定してるところが無かった笑 なので /etc 以下を探したわけでした。ろみたんは umask をいくつにしてますか。