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 をいくつにしてますか。