Fix up Rubinius specific library specs.
[rbx.git] / lib / etc.rb.ffi
blob4d023c20ecc6e2a8f88ca0629f756a341490dbb8
1 module Etc
2   class Passwd < FFI::Struct
3     @@@
4     struct do |s|
5       s.include "sys/types.h"
6       s.include "pwd.h"
8       s.name "struct passwd"
9       s.field :pw_name, :string
10       s.field :pw_passwd, :string
11       s.field :pw_uid, :uint
12       s.field :pw_gid, :uint
13       s.field :pw_dir, :string
14       s.field :pw_shell, :string
15     end
16     @@@
18     def name; self[:pw_name]; end
19     def passwd; self[:pw_passwd]; end
20     def uid; self[:pw_uid]; end
21     def gid; self[:pw_gid]; end
22     def dir; self[:pw_dir]; end
23     def shell; self[:pw_shell]; end
24   end
26   class Group < FFI::Struct
27     @@@
28     struct do |s|
29       s.include "sys/types.h"
30       s.include "grp.h"
32       s.name "struct group"
33       s.field :gr_name, :string
34       s.field :gr_gid, :uint
35     end
36     @@@
38     def name; self[:gr_name]; end
39     def gid; self[:gr_gid]; end
40   end
42   def self.getlogin
43     getpwuid.name
44   end
46   def self.getpwnam(name)
47     login = StringValue(name)
49     passwd_ptr = Platform::POSIX.getpwnam(name)
50     if passwd_ptr.nil?
51       raise ArgumentError, "cannot find user - #{name}"
52     end
54     Passwd.new(passwd_ptr)
55   end
57   def self.getpwuid(uid = Process.uid)
58     uid = Type.coerce_to(uid, Integer, :to_int)
60     passwd_ptr = Platform::POSIX.getpwuid(uid)
61     if passwd_ptr.nil?
62       raise ArgumentError, "cannot find user - #{uid}"
63     end
65     Passwd.new(passwd_ptr)
66   end
68   def self.setpwent
69     Platform::POSIX.setpwent
70   end
72   def self.getpwent
73     passwd_ptr = Platform::POSIX.getpwent
74     return nil if passwd_ptr.nil?
76     Passwd.new(passwd_ptr)
77   end
79   def self.endpwent
80     Platform::POSIX.endpwent
81   end
83   def self.passwd
84     setpwent
86     loop do
87       pw = getpwent
88       return if pw.nil?
90       yield pw
91     end
92   ensure
93     endpwent
94   end
96   def self.getgrnam(name)
97     name = StringValue(name)
99     group_ptr = Platform::POSIX.getgrnam(name)
100     if group_ptr.nil?
101       raise ArgumentError, "cannot find group - #{name}"
102     end
104     Group.new(group_ptr)
105   end
107   def self.getgrgid(gid = Process.gid)
108     gid = Type.coerce_to(gid, Integer, :to_int)
110     group_ptr = Platform::POSIX.getgrgid(gid)
111     if group_ptr.nil?
112       raise ArgumentError, "cannot find group - #{gid}"
113     end
115     Group.new(group_ptr)
116   end
118   def self.setgrent
119     Platform::POSIX.setgrent
120   end
122   def self.getgrent
123     group_ptr = Platform::POSIX.getgrent
124     return nil if group_ptr.nil?
126     Group.new(group_ptr)
127   end
129   def self.endgrent
130     Platform::POSIX.endgrent
131   end
133   def self.group
134     setgrent
136     loop do
137       gr = getgrent
138       return if gr.nil?
140       yield gr
141     end
142   ensure
143     endgrent
144   end