Module: Etc

Defined in:
etc.c

Constant Summary collapse

Passwd =
sPasswd
Group =
sGroup

Class Method Summary collapse

Class Method Details

.endgrentObject

Ends the process of scanning through the /etc/group file begun by getgrent, and closes the file.



518
519
520
521
522
523
524
525
# File 'etc.c', line 518

static VALUE
etc_endgrent(VALUE obj)
{
#ifdef HAVE_GETGRENT
    endgrent();
#endif
    return Qnil;
}

.endpwentObject

Ends the process of scanning through the /etc/passwd file begun with getpwent, and closes the file.



280
281
282
283
284
285
286
287
# File 'etc.c', line 280

static VALUE
etc_endpwent(VALUE obj)
{
#ifdef HAVE_GETPWENT
    endpwent();
#endif
    return Qnil;
}

.getgrentObject

Returns an entry from the /etc/group file. The first time it is called it opens the file and returns the first entry; each successive call returns the next entry, or nil if the end of the file has been reached.

To close the file when processing is complete, call endgrent.

Each entry is returned as a Struct::Group:

  • Group#name contains the name of the group as a String.

  • Group#passwd contains the encrypted password as a String. An 'x' is returned if password access to the group is not available; an empty string is returned if no password is needed to obtain membership of the group.

  • Group#gid contains the group's numeric ID as an integer.

  • Group#mem is an Array of Strings containing the short login names of the members of the group.



547
548
549
550
551
552
553
554
555
556
557
558
# File 'etc.c', line 547

static VALUE
etc_getgrent(VALUE obj)
{
#ifdef HAVE_GETGRENT
    struct group *gr;

    if (gr = getgrent()) {
	return setup_group(gr);
    }
#endif
    return Qnil;
}

.getgrgidObject

Returns information about the group with specified integer group id (gid), as found in /etc/group.

The information is returned as a Struct::Group; see getgrent above for details.

e.g. Etc.getgrgid(100) -> #<struct Struct::Group name="users", passwd="x", gid=100, mem=["meta", "root"]>



361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
# File 'etc.c', line 361

static VALUE
etc_getgrgid(int argc, VALUE *argv, VALUE obj)
{
#ifdef HAVE_GETGRENT
    VALUE id;
    gid_t gid;
    struct group *grp;

    rb_secure(4);
    if (rb_scan_args(argc, argv, "01", &id) == 1) {
	gid = NUM2GIDT(id);
    }
    else {
	gid = getgid();
    }
    grp = getgrgid(gid);
    if (grp == 0) rb_raise(rb_eArgError, "can't find group for %d", (int)gid);
    return setup_group(grp);
#else
    return Qnil;
#endif
}

.getgrnamObject

Returns information about the group with specified String name, as found in /etc/group.

The information is returned as a Struct::Group; see getgrent above for details.

e.g. Etc.getgrnam('users') -> #<struct Struct::Group name="users", passwd="x", gid=100, mem=["meta", "root"]>



394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
# File 'etc.c', line 394

static VALUE
etc_getgrnam(VALUE obj, VALUE nam)
{
#ifdef HAVE_GETGRENT
    struct group *grp;

    rb_secure(4);
    SafeStringValue(nam);
    grp = getgrnam(RSTRING_PTR(nam));
    if (grp == 0) rb_raise(rb_eArgError, "can't find group for %s", RSTRING_PTR(nam));
    return setup_group(grp);
#else
    return Qnil;
#endif
}

.getloginObject

Returns the short user name of the currently logged in user. Unfortunately, it is often rather easy to fool getlogin(). Avoid getlogin() for security-related purposes.

e.g.

Etc.getlogin -> 'guest'


50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'etc.c', line 50

static VALUE
etc_getlogin(VALUE obj)
{
    char *login;

    rb_secure(4);
#ifdef HAVE_GETLOGIN
    login = getlogin();
    if (!login) login = getenv("USER");
#else
    login = getenv("USER");
#endif

    if (login)
	return rb_tainted_str_new2(login);
    return Qnil;
}

.getpwentObject

Returns an entry from the /etc/passwd file. The first time it is called it opens the file and returns the first entry; each successive call returns the next entry, or nil if the end of the file has been reached.

To close the file when processing is complete, call endpwent.

Each entry is returned as a Struct::Passwd:

  • Passwd#name contains the short login name of the user as a String.

  • Passwd#passwd contains the encrypted password of the user as a String. an 'x' is returned if shadow passwords are in use. An '*' is returned if the user cannot log in using a password.

  • Passwd#uid contains the integer user ID (uid) of the user.

  • Passwd#gid contains the integer group ID (gid) of the user's primary group.

  • Passwd#gecos contains a longer String description of the user, such as a full name. Some Unix systems provide structured information in the gecos field, but this is system-dependent.

  • Passwd#dir contains the path to the home directory of the user as a String.

  • Passwd#shell contains the path to the login shell of the user as a String.



315
316
317
318
319
320
321
322
323
324
325
326
# File 'etc.c', line 315

static VALUE
etc_getpwent(VALUE obj)
{
#ifdef HAVE_GETPWENT
    struct passwd *pw;

    if (pw = getpwent()) {
	return setup_passwd(pw);
    }
#endif
    return Qnil;
}

.getpwnamObject

Returns the /etc/passwd information for the user with specified login name.

The information is returned as a Struct::Passwd; see getpwent above for details.

e.g. * Etc.getpwnam('root') -> #<struct Struct::Passwd name="root", passwd="x", uid=0, gid=0, gecos="root",dir="/root", shell="/bin/bash">



157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'etc.c', line 157

static VALUE
etc_getpwnam(VALUE obj, VALUE nam)
{
#ifdef HAVE_GETPWENT
    struct passwd *pwd;

    SafeStringValue(nam);
    pwd = getpwnam(RSTRING_PTR(nam));
    if (pwd == 0) rb_raise(rb_eArgError, "can't find user for %s", RSTRING_PTR(nam));
    return setup_passwd(pwd);
#else
    return Qnil;
#endif
}

.getpwuidObject

Returns the /etc/passwd information for the user with specified integer user id (uid).

The information is returned as a Struct::Passwd; see getpwent above for details.

e.g. * Etc.getpwuid(0) -> #<struct Struct::Passwd name="root", passwd="x", uid=0, gid=0, gecos="root",dir="/root", shell="/bin/bash">



126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'etc.c', line 126

static VALUE
etc_getpwuid(int argc, VALUE *argv, VALUE obj)
{
#if defined(HAVE_GETPWENT)
    VALUE id;
    rb_uid_t uid;
    struct passwd *pwd;

    rb_secure(4);
    if (rb_scan_args(argc, argv, "01", &id) == 1) {
	uid = NUM2UIDT(id);
    }
    else {
	uid = getuid();
    }
    pwd = getpwuid(uid);
    if (pwd == 0) rb_raise(rb_eArgError, "can't find user for %d", (int)uid);
    return setup_passwd(pwd);
#else
    return Qnil;
#endif
}

.groupObject

Provides a convenient Ruby iterator which executes a block for each entry in the /etc/group file.

The code block is passed an Struct::Group struct; see getgrent above for details.

Example:

require 'etc'

Etc.group {|g|
  puts g.name + ": " + g.mem.join(', ')
}


458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
# File 'etc.c', line 458

static VALUE
etc_group(VALUE obj)
{
#ifdef HAVE_GETGRENT
    struct group *grp;

    rb_secure(4);
    if (rb_block_given_p()) {
	each_group();
    }
    else if (grp = getgrent()) {
	return setup_group(grp);
    }
#endif
    return Qnil;
}

.passwdObject

Provides a convenient Ruby iterator which executes a block for each entry in the /etc/passwd file.

The code block is passed an Struct::Passwd struct; see getpwent above for details.

Example:

require 'etc'

Etc.passwd {|u|
  puts u.name + " = " + u.gecos
}


220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
# File 'etc.c', line 220

static VALUE
etc_passwd(VALUE obj)
{
#ifdef HAVE_GETPWENT
    struct passwd *pw;

    rb_secure(4);
    if (rb_block_given_p()) {
	each_passwd();
    }
    else if (pw = getpwent()) {
	return setup_passwd(pw);
    }
#endif
    return Qnil;
}

.setgrentObject

Resets the process of reading the /etc/group file, so that the next call to getgrent will return the first entry again.



506
507
508
509
510
511
512
513
# File 'etc.c', line 506

static VALUE
etc_setgrent(VALUE obj)
{
#ifdef HAVE_GETGRENT
    setgrent();
#endif
    return Qnil;
}

.setpwentObject

Resets the process of reading the /etc/passwd file, so that the next call to getpwent will return the first entry again.



268
269
270
271
272
273
274
275
# File 'etc.c', line 268

static VALUE
etc_setpwent(VALUE obj)
{
#ifdef HAVE_GETPWENT
    setpwent();
#endif
    return Qnil;
}

.sysconfdirObject

Returns system configuration directory.



571
572
573
574
575
576
577
578
579
# File 'etc.c', line 571

static VALUE
etc_sysconfdir(VALUE obj)
{
#ifdef _WIN32
    return rb_w32_special_folder(CSIDL_COMMON_APPDATA);
#else
    return rb_filesystem_str_new_cstr(SYSCONFDIR);
#endif
}

.systmpdirObject

Returns system temporary directory.



584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
# File 'etc.c', line 584

static VALUE
etc_systmpdir(void)
{
    VALUE tmpdir;
#ifdef _WIN32
    WCHAR path[_MAX_PATH];
    UINT len = rb_w32_system_tmpdir(path, numberof(path));
    if (!len) return Qnil;
    tmpdir = rb_w32_conv_from_wchar(path, rb_filesystem_encoding());
#else
    tmpdir = rb_filesystem_str_new_cstr("/tmp");
#endif
    FL_UNSET(tmpdir, FL_TAINT|FL_UNTRUSTED);
    return tmpdir;
}