summaryrefslogtreecommitdiff
path: root/ext/etc
diff options
context:
space:
mode:
Diffstat (limited to 'ext/etc')
-rw-r--r--ext/etc/MANIFEST5
-rw-r--r--ext/etc/depend1
-rw-r--r--ext/etc/etc.c260
-rw-r--r--ext/etc/etc.doc73
-rw-r--r--ext/etc/extconf.rb7
5 files changed, 346 insertions, 0 deletions
diff --git a/ext/etc/MANIFEST b/ext/etc/MANIFEST
new file mode 100644
index 0000000000..a0f521b386
--- /dev/null
+++ b/ext/etc/MANIFEST
@@ -0,0 +1,5 @@
+MANIFEST
+etc.c
+etc.doc
+depend
+extconf.rb
diff --git a/ext/etc/depend b/ext/etc/depend
new file mode 100644
index 0000000000..5c95ef117a
--- /dev/null
+++ b/ext/etc/depend
@@ -0,0 +1 @@
+etc.o : etc.c ../../ruby.h ../../config.h ../../defines.h
diff --git a/ext/etc/etc.c b/ext/etc/etc.c
new file mode 100644
index 0000000000..e4e4098f8a
--- /dev/null
+++ b/ext/etc/etc.c
@@ -0,0 +1,260 @@
+/************************************************
+
+ etc.c -
+
+ $Author: matz $
+ $Date: 1995/01/10 10:42:32 $
+ created at: Tue Mar 22 18:39:19 JST 1994
+
+************************************************/
+
+#include "ruby.h"
+
+#ifdef HAVE_GETPWENT
+#include <pwd.h>
+#endif
+
+#ifdef HAVE_GETGRENT
+#include <grp.h>
+#endif
+
+static VALUE sPasswd, sGroup;
+
+static VALUE
+etc_getlogin(obj)
+ VALUE obj;
+{
+#ifdef HAVE_GETLOGIN
+ char *getlogin();
+ char *login = getlogin();
+#else
+ char *getenv();
+ char *login = getenv("USER");
+#endif
+
+ if (login)
+ return str_new2(login);
+ return Qnil;
+}
+
+#ifdef HAVE_GETPWENT
+static VALUE
+setup_passwd(pwd)
+ struct passwd *pwd;
+{
+ if (pwd == Qnil) rb_sys_fail("/etc/passwd");
+ return struct_new(sPasswd,
+ str_new2(pwd->pw_name),
+ str_new2(pwd->pw_passwd),
+ INT2FIX(pwd->pw_uid),
+ INT2FIX(pwd->pw_gid),
+ str_new2(pwd->pw_gecos),
+ str_new2(pwd->pw_dir),
+ str_new2(pwd->pw_shell),
+#ifdef PW_CHANGE
+ INT2FIX(pwd->pw_change),
+#endif
+#ifdef PW_QUOTA
+ INT2FIX(pwd->pw_quota),
+#endif
+#ifdef PW_AGE
+ INT2FIX(pwd->pw_age),
+#endif
+#ifdef PW_CLASS
+ str_new2(pwd->pw_class),
+#endif
+#ifdef PW_COMMENT
+ str_new2(pwd->pw_comment),
+#endif
+#ifdef PW_EXPIRE
+ INT2FIX(pwd->pw_expire),
+#endif
+ Qnil);
+}
+#endif
+
+static VALUE
+etc_getpwuid(argc, argv, obj)
+ int argc;
+ VALUE *argv;
+ VALUE obj;
+{
+#ifdef HAVE_GETPWENT
+ VALUE id;
+ int uid;
+ struct passwd *pwd;
+
+ if (rb_scan_args(argc, argv, "01", &id) == 1) {
+ uid = NUM2INT(id);
+ }
+ else {
+ uid = getuid();
+ }
+ pwd = getpwuid(uid);
+ if (pwd == Qnil) Fail("can't find user for %d", uid);
+ return setup_passwd(pwd);
+#else
+ return Qnil;
+#endif
+}
+
+static VALUE
+etc_getpwnam(obj, nam)
+ VALUE obj, nam;
+{
+#ifdef HAVE_GETPWENT
+ struct passwd *pwd;
+
+ Check_Type(nam, T_STRING);
+ pwd = getpwnam(RSTRING(nam)->ptr);
+ if (pwd == Qnil) Fail("can't find user for %s", RSTRING(nam)->ptr);
+ return setup_passwd(pwd);
+#else
+ return Qnil;
+#endif
+}
+
+static VALUE
+etc_passwd(obj)
+ VALUE obj;
+{
+#ifdef HAVE_GETPWENT
+ struct passwd *pw;
+
+ if (iterator_p()) {
+ setpwent();
+ while (pw = getpwent()) {
+ rb_yield(setup_passwd(pw));
+ }
+ endpwent();
+ return obj;
+ }
+ pw = getpwent();
+ if (pw == Qnil) Fail("can't fetch next -- /etc/passwd");
+ return setup_passwd(pw);
+#else
+ return Qnil;
+#endif
+}
+
+#ifdef HAVE_GETGRENT
+static VALUE
+setup_group(grp)
+ struct group *grp;
+{
+ VALUE mem;
+ char **tbl;
+
+ mem = ary_new();
+ tbl = grp->gr_mem;
+ while (*tbl) {
+ ary_push(mem, str_new2(*tbl));
+ tbl++;
+ }
+ return struct_new(sGroup,
+ str_new2(grp->gr_name),
+ str_new2(grp->gr_passwd),
+ INT2FIX(grp->gr_gid),
+ mem,
+ Qnil);
+}
+#endif
+
+static VALUE
+etc_getgrgid(obj, id)
+ VALUE obj, id;
+{
+#ifdef HAVE_GETGRENT
+ int gid;
+ struct group *grp;
+
+ gid = NUM2INT(id);
+ grp = getgrgid(gid);
+ if (grp == Qnil) Fail("can't find group for %d", gid);
+ return setup_group(grp);
+#else
+ return Qnil;
+#endif
+}
+
+static VALUE
+etc_getgrnam(obj, nam)
+ VALUE obj, nam;
+{
+#ifdef HAVE_GETGRENT
+ struct group *grp;
+
+ Check_Type(nam, T_STRING);
+ grp = getgrnam(RSTRING(nam)->ptr);
+ if (grp == Qnil) Fail("can't find group for %s", RSTRING(nam)->ptr);
+ return setup_group(grp);
+#else
+ return Qnil;
+#endif
+}
+
+static VALUE
+etc_group(obj)
+ VALUE obj;
+{
+#ifdef HAVE_GETGRENT
+ struct group *grp;
+
+ if (iterator_p()) {
+ setgrent();
+ while (grp = getgrent()) {
+ rb_yield(setup_group(grp));
+ }
+ endgrent();
+ return obj;
+ }
+ return setup_group(getgrent());
+#else
+ return Qnil;
+#endif
+}
+
+VALUE mEtc;
+
+void
+Init_etc()
+{
+ mEtc = rb_define_module("Etc");
+
+ rb_define_module_function(mEtc, "getlogin", etc_getlogin, 0);
+
+ rb_define_module_function(mEtc, "getpwuid", etc_getpwuid, -1);
+ rb_define_module_function(mEtc, "getpwnam", etc_getpwnam, 1);
+ rb_define_module_function(mEtc, "passwd", etc_passwd, 0);
+
+ rb_define_module_function(mEtc, "getgrgid", etc_getgrgid, 1);
+ rb_define_module_function(mEtc, "getgrnam", etc_getgrnam, 1);
+ rb_define_module_function(mEtc, "group", etc_group, 0);
+
+ sPasswd = struct_define("Passwd",
+ "name", "passwd", "uid", "gid",
+ "gecos", "dir", "shell",
+#ifdef PW_CHANGE
+ "change",
+#endif
+#ifdef PW_QUOTA
+ "quota",
+#endif
+#ifdef PW_AGE
+ "age",
+#endif
+#ifdef PW_CLASS
+ "class",
+#endif
+#ifdef PW_COMMENT
+ "comment",
+#endif
+#ifdef PW_EXPIRE
+ "expire",
+#endif
+ Qnil);
+
+#ifdef HAVE_GETGRENT
+ sGroup = struct_define("Group", "name", "passwd", "gid", "mem", Qnil);
+#endif
+}
diff --git a/ext/etc/etc.doc b/ext/etc/etc.doc
new file mode 100644
index 0000000000..2af895c9de
--- /dev/null
+++ b/ext/etc/etc.doc
@@ -0,0 +1,73 @@
+.\" etc.doc - -*- Indented-Text -*- created at: Fri Jul 14 00:47:15 JST 1995
+
+** Etc(モジュール)
+
+/etcディレクトリ以下の情報を得るためのモジュール.クラスにインクルード
+して使うこともできる.
+
+Methods:
+Single Methods:
+
+ getlogin
+
+ 自分のlogin名を返す.これが失敗した場合はgetpwuid()を用いると
+ 良い.
+
+ getpwnam(name)
+
+ /etc/passwdファイル(あるいはDBMファイルやNISデータベース)を検
+ 索し,nameの名前を持つpasswdエントリを返す.戻り値はpasswd構造
+ 体で以下のメンバを持つ.
+
+ struct passwd
+ name # ユーザ名(文字列)
+ passwd # パスワード(文字列)
+ uid # ユーザID(整数)
+ gid # グループID(整数)
+ gecos # gecosフィールド(文字列)
+ dir # ホームディレクトリ(文字列)
+ shell # ログインシェル(文字列)
+ # 以降のメンバはシステムによっては提供されない.
+ change # パスワード変更時間(整数)
+ quota # クォータ(整数)
+ age # エージ(整数)
+ class # ユーザアクセスクラス(文字列)
+ comment # コメント(文字列)
+ expire # アカウント有効期限(整数)
+ end
+
+ 詳細はgetpwnam(3)を参照のこと.
+
+ getpwuid([uid])
+
+ uidをユーザIDとするpasswdエントリを返す.戻り値はgetpwnam()と
+ 同様である.引数を省略した場合にはgetuid()の値を用いる.詳細は
+ getpwuid(3)を参照のこと.
+
+ getgrgid(gid)
+
+ /etc/groupファイル(あるいは…getpwnam参照)を検索し,gidをグルー
+ プIDとするグループエントリを返す.戻り値はgroup構造体で以下の
+ メンバを持つ.
+
+ struct group
+ name # グループ名(文字列)
+ passwd # グループのパスワード(文字列)
+ gid # グループID(整数)
+ mem # グループメンバ名の配列
+ end
+
+ 詳細はgetgrgid(3)を参照のこと.
+
+ getgrnam(name)
+
+ nameという名前のグループエントリを返す.戻り値はgetgrgid()と同
+ 様である.詳細はgetgrnam(3)を参照.
+
+ group
+
+ 全てのグループエントリを順にアクセスするためのイテレータ.
+
+ passwd
+
+ 全てのpasswdエントリを順にアクセスするためのイテレータ.
diff --git a/ext/etc/extconf.rb b/ext/etc/extconf.rb
new file mode 100644
index 0000000000..884de93ec8
--- /dev/null
+++ b/ext/etc/extconf.rb
@@ -0,0 +1,7 @@
+have_library("sun", "getpwnam") # NIS (== YP) interface for IRIX 4
+a = have_func("getlogin")
+b = have_func("getpwent")
+c = have_func("getgrent")
+if a or b or c
+ create_makefile("etc")
+end