[#7968] array .{first, last, at} — Kazunori NISHI <kazunori@...>

西@九大です。

25 messages 1999/10/07
[#7969] Re: array .{first, last, at} — nobu.nakada@... 1999/10/07

なかだです。

[#7983] Re: array .{first, last, at} — Kazunori NISHI <kazunori@...> 1999/10/12

西@九大です。

[#7984] Re: array .{first, last, at} — matz@... (Yukihiro Matsumoto) 1999/10/12

まつもと ゆきひろです

[#7985] [patch] Array#delete_at w/ minus value — EGUCHI Osamu <eguchi@...> 1999/10/12

えぐち@エスアンドイーです。

[ruby-dev:8078] [patch] File.lchmod and File.lchown

From: EGUCHI Osamu <eguchi@...>
Date: 1999-10-20 16:05:52 UTC
List: ruby-dev #8078
えぐち@エスアンドイーです。

シンボリックリンクのモードと所有者を変えるメソッドを
作ってみました。

lchmod(2) と lchown(2) は、限られたOSしかサポートしていないので、
AC_CHECK_FUNCS のチェックを行うようにしました。

#4.4BSD 以外で使える環境あるのだろうか?
##一般的でないので、44bsd 拡張ライブラリの方がいいですか?

	えぐち

Index: configure.in
===================================================================
RCS file: /usr/home/eguchi/cvs.netlab.co.jp//ruby/configure.in,v
retrieving revision 1.3
diff -d -u -r1.3 configure.in
--- configure.in	1999/09/01 09:48:00	1.3
+++ configure.in	1999/10/20 15:25:20
@@ -180,7 +180,8 @@
 	      truncate chsize times utimes fcntl lockf setitimer\
 	      setruid seteuid setreuid setrgid setegid setregid\
 	      getpgrp setpgrp getpgid setpgid getgroups getpriority\
-	      dlopen sigprocmask sigaction _setjmp setsid)
+	      dlopen sigprocmask sigaction _setjmp setsid \
+	      lchmod lchown )
 AC_STRUCT_TIMEZONE
 if test "$ac_cv_func_strftime" = no; then
     AC_TRY_LINK([],
Index: file.c
===================================================================
RCS file: /usr/home/eguchi/cvs.netlab.co.jp//ruby/file.c,v
retrieving revision 1.4
diff -d -u -r1.4 file.c
--- file.c	1999/10/12 04:53:33	1.4
+++ file.c	1999/10/20 15:37:12
@@ -775,7 +775,43 @@
     return INT2FIX(n);
 }
 
+#ifdef HAVE_LCHMOD
+static void
+lchmod_internal(path, mode)
+    const char *path;
+    int mode;
+{
+    if (lchmod(path, mode) == -1)
+	rb_sys_fail(path);
+}
+
 static VALUE
+rb_file_s_lchmod(argc, argv)
+    int argc;
+    VALUE *argv;
+{
+    VALUE vmode;
+    VALUE rest;
+    int mode, n;
+
+    rb_scan_args(argc, argv, "1*", &vmode, &rest);
+    mode = NUM2INT(vmode);
+
+    n = apply2files(lchmod_internal, rest, mode);
+    return INT2FIX(n);
+}
+#else
+static VALUE
+rb_file_s_lchmod(argc, argv)
+    int argc;
+    VALUE *argv;
+{
+    rb_notimplement();  
+    return Qnil;		/* not reached */
+}
+#endif
+
+static VALUE
 rb_file_chmod(obj, vmode)
     VALUE obj, vmode;
 {
@@ -837,7 +873,54 @@
     return INT2FIX(n);
 }
 
+#ifdef HAVE_LCHOWN
+static void
+lchown_internal(path, args)
+    const char *path;
+    struct chown_args *args;
+{
+    if (lchown(path, args->owner, args->group) < 0)
+	rb_sys_fail(path);
+}
+
+static VALUE
+rb_file_s_lchown(argc, argv)
+    int argc;
+    VALUE *argv;
+{
+    VALUE o, g, rest;
+    struct chown_args arg;
+    int n;
+
+    rb_scan_args(argc, argv, "2*", &o, &g, &rest);
+    if (NIL_P(o)) {
+	arg.owner = -1;
+    }
+    else {
+	arg.owner = NUM2INT(o);
+    }
+    if (NIL_P(g)) {
+	arg.group = -1;
+    }
+    else {
+	arg.group = NUM2INT(g);
+    }
+
+    n = apply2files(lchown_internal, rest, &arg);
+    return INT2FIX(n);
+}
+#else
 static VALUE
+rb_file_s_lchown(argc, argv)
+    int argc;
+    VALUE *argv;
+{
+    rb_notimplement();  
+    return Qnil;		/* not reached */
+}
+#endif
+
+static VALUE
 rb_file_chown(obj, owner, group)
     VALUE obj, owner, group;
 {
@@ -1599,6 +1682,8 @@
     rb_define_singleton_method(rb_cFile, "utime", rb_file_s_utime, -1);
     rb_define_singleton_method(rb_cFile, "chmod", rb_file_s_chmod, -1);
     rb_define_singleton_method(rb_cFile, "chown", rb_file_s_chown, -1);
+    rb_define_singleton_method(rb_cFile, "lchmod", rb_file_s_lchmod, -1);
+    rb_define_singleton_method(rb_cFile, "lchown", rb_file_s_lchown, -1);
 
     rb_define_singleton_method(rb_cFile, "link", rb_file_s_link, 2);
     rb_define_singleton_method(rb_cFile, "symlink", rb_file_s_symlink, 2);

In This Thread

Prev Next