2014-05-27 :-(
_ 午後
1300 検討
_ [コードリーディング][NetBSD][/bin/domainname][domainname][getdomainname][setdomainname]NetBSD /bin/domainname を読む
ソース src/bin/domainname/domainname.c
マニュアル domainname - NetBSD Manual Pages
読む。
if (*argv) { if (setdomainname(*argv, strlen(*argv))) err(1, "setdomainname"); } else { if (getdomainname(domainname, sizeof(domainname))) err(1, "getdomainname"); (void)printf("%s\n", domainname); }
とはいえこれも hostname と同じ。getdomainname または setdomainname を呼び出す。
マニュアル getdomainname - NetBSD Manual Pages
ソース src/lib/libc/gen/setdomainname.c
int setdomainname(name, namelen) const char *name; size_t namelen; { int mib[2]; _DIAGASSERT(name != NULL); mib[0] = CTL_KERN; mib[1] = KERN_DOMAINNAME; if (sysctl(mib, 2, NULL, NULL, name, namelen) == -1) return (-1); return (0); }
ソース src/lib/libc/gen/getdomainname.c
int getdomainname(name, namelen) char *name; size_t namelen; { int mib[2]; size_t size; int olderrno; _DIAGASSERT(name != NULL); mib[0] = CTL_KERN; mib[1] = KERN_DOMAINNAME; size = namelen; olderrno = errno; if (sysctl(mib, 2, name, &size, NULL, 0) == -1) { if (errno == ENOMEM) { errno = olderrno; return (0); } return (-1); } return (0); }
sysctl を呼び出す
- sysctl(3) - NetBSD Manual Pages プログラマ向け
- sysctl(7) - NetBSD Manual Pages システム管理者向け
CTL_KERN と KERN_DOMAINNAME はこれ
kern.domainname (KERN_DOMAINNAME) Get or set the YP domain name.
_ [NetBSD][/bin/kill][kill][コードリーディング]NetBSD /bin/kill を読む
ソース src/bin/kill/kill.c
マニュアル kill - NetBSD Manual Pages
使用例
kill 12345 kill -9 12345 kill -HUP 12345 kill -SIGHUP 12345
よむ。
numsig にデフォルトのシグナル番号を設定。デフォルトでは SIGTERM
numsig = SIGTERM;
↑のように呼び出した場合。つまり -l も -s もしない場合はここを通る。
} else if (**argv == '-') { char *sn = *argv + 1; // kill -HUP 12345 などの場合 if (isalpha((unsigned char)*sn)) { // -HUP や -SIGHUP を 9 へ変換して numsig へ格納 if ((numsig = signame_to_signum(sn)) < 0) nosig(sn); // kill -9 12345 などの場合 } else if (isdigit((unsigned char)*sn)) { // 数値へ変換して numsig へ格納 numsig = strtoimax(sn, &ep, 10); 以下略
シグナル名からシグナル番号へ変換する処理を見る。
static int signame_to_signum(char *sig) { int n; // SIGHUP などが与えられた場合は HUP とする if (strncasecmp(sig, "sig", 3) == 0) sig += 3; // sys_signame を線形探索してシグナル名を検索 // シグナル名が格納されているインデックスがそのままシグナル番号となる。 for (n = 1; n < NSIG; n++) { if (!strcasecmp(sys_signame[n], sig)) return (n); } return (-1); }
strncasecmp は大文字小文字を区別しないで比較 strcasecmp - NetBSD Manual Pages
sys_signame は以下で定義されている。
lib/libc/compat/gen/compat_signame.c
const char *const sys_signame[] = { "Signal 0", /* 0 */ "HUP", /* 1 SIGHUP */ "INT", /* 2 SIGINT */ "QUIT", /* 3 SIGQUIT */ "ILL", /* 4 SIGILL */ "TRAP", /* 5 SIGTRAP */ "ABRT", /* 6 SIGABRT */ "EMT", /* 7 SIGEMT */ "FPE", /* 8 SIGFPE */ "KILL", /* 9 SIGKILL */ "BUS", /* 10 SIGBUS */ "SEGV", /* 11 SIGSEGV */ "SYS", /* 12 SIGSYS */ "PIPE", /* 13 SIGPIPE */ "ALRM", /* 14 SIGALRM */ "TERM", /* 15 SIGTERM */ "URG", /* 16 SIGURG */ "STOP", /* 17 SIGSTOP */ "TSTP", /* 18 SIGTSTP */ "CONT", /* 19 SIGCONT */ "CHLD", /* 20 SIGCHLD */ "TTIN", /* 21 SIGTTIN */ "TTOU", /* 22 SIGTTOU */ "IO", /* 23 SIGIO */ "XCPU", /* 24 SIGXCPU */ "XFSZ", /* 25 SIGXFSZ */ "VTALRM", /* 26 SIGVTALRM */ "PROF", /* 27 SIGPROF */ "WINCH", /* 28 SIGWINCH */ "INFO", /* 29 SIGINFO */ "USR1", /* 30 SIGUSR1 */ "USR2", /* 31 SIGUSR2 */ };
続き。
プロセス番号を得る。文字列から数値へ変換
pid = strtoimax(*argv, &ep, 10);
ここに来るまでで得たシグナル番号とプロセス番号を用いて kill(2) を呼ぶ。kill(2) - NetBSD Manual Pages
if (kill((pid_t) pid, (int) numsig) == -1) {