2000-02-18 03:38:33 +08:00
|
|
|
/* passwd.cc: getpwnam () and friends
|
|
|
|
|
2003-01-10 20:32:49 +08:00
|
|
|
Copyright 1996, 1997, 1998, 2001, 2002, 2003 Red Hat, Inc.
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
This file is part of Cygwin.
|
|
|
|
|
|
|
|
This software is a copyrighted work licensed under the terms of the
|
|
|
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
|
|
|
details. */
|
|
|
|
|
2000-08-03 00:28:18 +08:00
|
|
|
#include "winsup.h"
|
2000-02-18 03:38:33 +08:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <pwd.h>
|
|
|
|
#include <stdio.h>
|
2000-08-22 13:10:20 +08:00
|
|
|
#include "cygerrno.h"
|
2001-07-27 03:22:24 +08:00
|
|
|
#include "security.h"
|
2000-08-22 13:10:20 +08:00
|
|
|
#include "fhandler.h"
|
2001-08-07 16:56:22 +08:00
|
|
|
#include "path.h"
|
2001-10-01 12:10:07 +08:00
|
|
|
#include "dtable.h"
|
2000-08-12 13:35:42 +08:00
|
|
|
#include "pinfo.h"
|
2000-11-15 08:13:09 +08:00
|
|
|
#include "cygheap.h"
|
2000-09-08 00:23:51 +08:00
|
|
|
#include <sys/termios.h>
|
2001-09-10 00:52:37 +08:00
|
|
|
#include "pwdgrp.h"
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
/* Read /etc/passwd only once for better performance. This is done
|
|
|
|
on the first call that needs information from it. */
|
|
|
|
|
2003-01-20 10:57:54 +08:00
|
|
|
passwd *passwd_buf;
|
2003-01-21 14:58:11 +08:00
|
|
|
/* FIXME: This really should use a constructor, but they are slow */
|
|
|
|
static pwdgrp pr (passwd_buf);
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
/* Position in the passwd cache */
|
2001-01-28 13:51:15 +08:00
|
|
|
#define pw_pos _reent_winsup ()->_pw_pos
|
2000-02-18 03:38:33 +08:00
|
|
|
|
|
|
|
/* Parse /etc/passwd line into passwd structure. */
|
2003-01-20 10:57:54 +08:00
|
|
|
bool
|
2003-01-24 11:53:46 +08:00
|
|
|
pwdgrp::parse_passwd ()
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-01-20 10:57:54 +08:00
|
|
|
# define res (*passwd_buf)[curr_lines]
|
2003-01-27 08:16:01 +08:00
|
|
|
res.pw_name = next_str (':');
|
|
|
|
res.pw_passwd = next_str (':');
|
2003-01-28 01:00:17 +08:00
|
|
|
if (!next_num (res.pw_uid))
|
|
|
|
return false;
|
|
|
|
if (!next_num (res.pw_gid))
|
|
|
|
return false;
|
2003-01-26 13:38:38 +08:00
|
|
|
res.pw_comment = NULL;
|
2003-01-27 08:16:01 +08:00
|
|
|
res.pw_gecos = next_str (':');
|
|
|
|
res.pw_dir = next_str (':');
|
|
|
|
res.pw_shell = next_str (':');
|
2003-01-20 10:57:54 +08:00
|
|
|
return true;
|
|
|
|
# undef res
|
2000-02-18 03:38:33 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Read in /etc/passwd and save contents in the password cache.
|
2003-01-17 13:18:30 +08:00
|
|
|
This sets pr to loaded or emulated so functions in this file can
|
2000-07-26 19:48:38 +08:00
|
|
|
tell that /etc/passwd has been read in or will be emulated. */
|
2003-01-21 14:58:11 +08:00
|
|
|
void
|
|
|
|
pwdgrp::read_passwd ()
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-01-26 13:38:38 +08:00
|
|
|
load ("/etc/passwd");
|
2003-01-21 14:58:11 +08:00
|
|
|
|
|
|
|
char strbuf[128] = "";
|
|
|
|
bool searchentry = true;
|
|
|
|
struct passwd *pw;
|
|
|
|
|
|
|
|
if (wincap.has_security ())
|
|
|
|
{
|
2003-02-01 01:00:42 +08:00
|
|
|
/* must be static */
|
2003-01-21 14:58:11 +08:00
|
|
|
static char NO_COPY pretty_ls[] = "????????:*:-1:-1:";
|
2003-01-26 13:38:38 +08:00
|
|
|
add_line (pretty_ls);
|
2003-01-21 14:58:11 +08:00
|
|
|
cygsid tu = cygheap->user.sid ();
|
|
|
|
tu.string (strbuf);
|
|
|
|
if (myself->uid == ILLEGAL_UID)
|
|
|
|
searchentry = !internal_getpwsid (tu);
|
|
|
|
}
|
|
|
|
else if (myself->uid == ILLEGAL_UID)
|
|
|
|
searchentry = !internal_getpwuid (DEFAULT_UID);
|
|
|
|
if (searchentry &&
|
|
|
|
(!(pw = internal_getpwnam (cygheap->user.name ())) ||
|
|
|
|
(myself->uid != ILLEGAL_UID &&
|
|
|
|
myself->uid != (__uid32_t) pw->pw_uid &&
|
|
|
|
!internal_getpwuid (myself->uid))))
|
2002-06-05 19:10:15 +08:00
|
|
|
{
|
2003-02-02 02:41:29 +08:00
|
|
|
static char linebuf[1024]; // must be static and
|
|
|
|
// should not be NO_COPY
|
2003-01-21 14:58:11 +08:00
|
|
|
(void) cygheap->user.ontherange (CH_HOME, NULL);
|
|
|
|
snprintf (linebuf, sizeof (linebuf), "%s:*:%lu:%lu:,%s:%s:/bin/sh",
|
|
|
|
cygheap->user.name (),
|
2003-02-06 22:01:54 +08:00
|
|
|
myself->uid == ILLEGAL_UID ? UNKNOWN_UID : myself->uid,
|
2003-01-21 14:58:11 +08:00
|
|
|
myself->gid,
|
|
|
|
strbuf, getenv ("HOME") ?: "");
|
|
|
|
debug_printf ("Completing /etc/passwd: %s", linebuf);
|
2003-01-26 13:38:38 +08:00
|
|
|
add_line (linebuf);
|
2002-06-05 19:10:15 +08:00
|
|
|
}
|
2001-09-28 15:01:22 +08:00
|
|
|
return;
|
2000-02-18 03:38:33 +08:00
|
|
|
}
|
|
|
|
|
2002-11-21 01:10:05 +08:00
|
|
|
struct passwd *
|
2003-02-04 22:58:04 +08:00
|
|
|
internal_getpwsid (cygpsid &sid)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2002-11-21 01:10:05 +08:00
|
|
|
struct passwd *pw;
|
|
|
|
char *ptr1, *ptr2, *endptr;
|
|
|
|
char sid_string[128] = {0,','};
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-02-02 02:41:29 +08:00
|
|
|
pr.refresh (false);
|
2002-11-21 01:10:05 +08:00
|
|
|
|
|
|
|
if (sid.string (sid_string + 2))
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2002-11-21 01:10:05 +08:00
|
|
|
endptr = strchr (sid_string + 2, 0) - 1;
|
2003-01-20 10:57:54 +08:00
|
|
|
for (int i = 0; i < pr.curr_lines; i++)
|
2002-11-21 01:10:05 +08:00
|
|
|
if ((pw = passwd_buf + i)->pw_dir > pw->pw_gecos + 8)
|
|
|
|
for (ptr1 = endptr, ptr2 = pw->pw_dir - 2;
|
|
|
|
*ptr1 == *ptr2; ptr2--)
|
|
|
|
if (!*--ptr1)
|
|
|
|
return pw;
|
2000-02-18 03:38:33 +08:00
|
|
|
}
|
2000-07-26 19:48:38 +08:00
|
|
|
return NULL;
|
2000-02-18 03:38:33 +08:00
|
|
|
}
|
|
|
|
|
2002-12-10 Pierre Humblet <pierre.humblet@ieee.org>
* pwdgrp.h (pwdgrp_check::pwdgrp_state): Replace by
pwdgrp_check::isinitializing ().
(pwdgrp_check::isinitializing): Create.
* passwd.cc (grab_int): Change type to unsigned, use strtoul and
set the pointer content to 0 if the field is invalid.
(parse_pwd): Move validity test after getting pw_gid.
(read_etc_passwd): Replace "passwd_state <= " by
passwd_state::isinitializing ().
(internal_getpwuid): Ditto.
(internal_getpwnam): Ditto.
(getpwent): Ditto.
(getpass): Ditto.
* grp.cc (parse_grp): Use strtoul for gr_gid and verify the validity.
(read_etc_group): Replace "group_state <= " by
group_state::isinitializing ().
(internal_getgrgid): Ditto.
(getgrent32): Ditto.
(internal_getgrent): Ditto.
2002-12-10 Pierre Humblet <pierre.humblet@ieee.org>
* security.h: Move declarations of internal_getgrent,
internal_getpwsid and internal_getgrsid to pwdgrp.h.
* pwdgrp.h: Declare internal_getpwsid, internal_getpwnam,
internal_getpwuid, internal_getgrsid, internal_getgrgid,
internal_getgrnam, internal_getgrent and internal_getgroups.
Delete "emulated" from enum pwdgrp_state.
(pwdgrp_check::isuninitialized): Create.
(pwdgrp_check::pwdgrp_state): Change state to initializing
rather than to uninitialized.
(pwdgrp_read::gets): Remove trailing CRs.
* passwd.cc (grab_string): Don't look for NLs.
(grab_int): Ditto.
(parse_pwd): Don't look for CRs. Return 0 if entry is too short.
(search_for): Delete.
(read_etc_passwd): Simplify tests to actually read the file.
Set state to loaded before making internal_getpwXX calls.
Replace search_for calls by equivalent internal_pwgetXX calls.
(internal_getpwsid): Use passwd_state.isuninitialized to decide
to call read_etc_passwd.
(internal_getpwuid): Create.
(internal_getpwnam): Create.
(getpwuid32): Simply call internal_getpwuid.
(getpwuid_r32): Call internal_getpwuid.
(getpwnam): Simply call internal_getpwnam.
(getpwnam_r): Call internal_getpwnam.
* grp.cc (parse_grp): Don't look for CRs. Adjust blank space.
(add_grp_line): Adjust blank space.
(class group_lock): Ditto.
(read_etc_group): Simplify tests to actually read the file.
Set state to loaded before making internal_getgrXX calls.
Replace getgrXX calls by equivalent internal calls.
(internal_getgrsid): Use group_state.isuninitialized to decide
to call read_etc_group.
(internal_getgrgid): Create.
(internal_getgrnam): Create.
(getgroups32): Simply call internal_getgrgid.
(getgrnam32): Simply call internal_getgrnam.
(internal_getgrent): Call group_state.isuninitialized.
(internal_getgroups): Create from the former getgroups32, using
two of the four arguments. Set gid to myself->gid and username
to cygheap->user.name ().
(getgroups32): Simply call internal_getgroup.
(getgroups): Call internal_getgroup instead of getgroups32.
(setgroups32): Call internal versions of get{pw,gr}XX.
* sec_helper.cc: Include pwdgrp.h.
(is_grp_member): Call internal versions of get{pw,gr}XX.
* security.cc: Include pwdgrp.h.
(alloc_sd): Call internal versions of get{pw,gr}XX.
* syscalls.cc: Include pwdgrp.h.
(seteuid32): Call internal versions of get{pw,gr}XX.
(setegid32): Ditto.
* uinfo.cc: Include pwdgrp.h.
(internal_getlogin): Call internal versions of get{pw,gr}XX.
(cygheap_user::ontherange): Ditto.
* sec_acl.cc: Include pwdgrp.h.
(setacl): Call internal versions of get{pw,gr}XX.
(acl_access): Ditto and simplify logic.
(aclfromtext): Ditto.
2002-12-10 20:43:49 +08:00
|
|
|
struct passwd *
|
2003-01-18 02:05:32 +08:00
|
|
|
internal_getpwuid (__uid32_t uid, bool check)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
2003-01-21 14:58:11 +08:00
|
|
|
pr.refresh (check);
|
2001-06-26 22:47:48 +08:00
|
|
|
|
2003-01-20 10:57:54 +08:00
|
|
|
for (int i = 0; i < pr.curr_lines; i++)
|
2002-12-10 Pierre Humblet <pierre.humblet@ieee.org>
* pwdgrp.h (pwdgrp_check::pwdgrp_state): Replace by
pwdgrp_check::isinitializing ().
(pwdgrp_check::isinitializing): Create.
* passwd.cc (grab_int): Change type to unsigned, use strtoul and
set the pointer content to 0 if the field is invalid.
(parse_pwd): Move validity test after getting pw_gid.
(read_etc_passwd): Replace "passwd_state <= " by
passwd_state::isinitializing ().
(internal_getpwuid): Ditto.
(internal_getpwnam): Ditto.
(getpwent): Ditto.
(getpass): Ditto.
* grp.cc (parse_grp): Use strtoul for gr_gid and verify the validity.
(read_etc_group): Replace "group_state <= " by
group_state::isinitializing ().
(internal_getgrgid): Ditto.
(getgrent32): Ditto.
(internal_getgrent): Ditto.
2002-12-10 Pierre Humblet <pierre.humblet@ieee.org>
* security.h: Move declarations of internal_getgrent,
internal_getpwsid and internal_getgrsid to pwdgrp.h.
* pwdgrp.h: Declare internal_getpwsid, internal_getpwnam,
internal_getpwuid, internal_getgrsid, internal_getgrgid,
internal_getgrnam, internal_getgrent and internal_getgroups.
Delete "emulated" from enum pwdgrp_state.
(pwdgrp_check::isuninitialized): Create.
(pwdgrp_check::pwdgrp_state): Change state to initializing
rather than to uninitialized.
(pwdgrp_read::gets): Remove trailing CRs.
* passwd.cc (grab_string): Don't look for NLs.
(grab_int): Ditto.
(parse_pwd): Don't look for CRs. Return 0 if entry is too short.
(search_for): Delete.
(read_etc_passwd): Simplify tests to actually read the file.
Set state to loaded before making internal_getpwXX calls.
Replace search_for calls by equivalent internal_pwgetXX calls.
(internal_getpwsid): Use passwd_state.isuninitialized to decide
to call read_etc_passwd.
(internal_getpwuid): Create.
(internal_getpwnam): Create.
(getpwuid32): Simply call internal_getpwuid.
(getpwuid_r32): Call internal_getpwuid.
(getpwnam): Simply call internal_getpwnam.
(getpwnam_r): Call internal_getpwnam.
* grp.cc (parse_grp): Don't look for CRs. Adjust blank space.
(add_grp_line): Adjust blank space.
(class group_lock): Ditto.
(read_etc_group): Simplify tests to actually read the file.
Set state to loaded before making internal_getgrXX calls.
Replace getgrXX calls by equivalent internal calls.
(internal_getgrsid): Use group_state.isuninitialized to decide
to call read_etc_group.
(internal_getgrgid): Create.
(internal_getgrnam): Create.
(getgroups32): Simply call internal_getgrgid.
(getgrnam32): Simply call internal_getgrnam.
(internal_getgrent): Call group_state.isuninitialized.
(internal_getgroups): Create from the former getgroups32, using
two of the four arguments. Set gid to myself->gid and username
to cygheap->user.name ().
(getgroups32): Simply call internal_getgroup.
(getgroups): Call internal_getgroup instead of getgroups32.
(setgroups32): Call internal versions of get{pw,gr}XX.
* sec_helper.cc: Include pwdgrp.h.
(is_grp_member): Call internal versions of get{pw,gr}XX.
* security.cc: Include pwdgrp.h.
(alloc_sd): Call internal versions of get{pw,gr}XX.
* syscalls.cc: Include pwdgrp.h.
(seteuid32): Call internal versions of get{pw,gr}XX.
(setegid32): Ditto.
* uinfo.cc: Include pwdgrp.h.
(internal_getlogin): Call internal versions of get{pw,gr}XX.
(cygheap_user::ontherange): Ditto.
* sec_acl.cc: Include pwdgrp.h.
(setacl): Call internal versions of get{pw,gr}XX.
(acl_access): Ditto and simplify logic.
(aclfromtext): Ditto.
2002-12-10 20:43:49 +08:00
|
|
|
if (uid == (__uid32_t) passwd_buf[i].pw_uid)
|
|
|
|
return passwd_buf + i;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct passwd *
|
2003-01-18 02:05:32 +08:00
|
|
|
internal_getpwnam (const char *name, bool check)
|
2002-12-10 Pierre Humblet <pierre.humblet@ieee.org>
* pwdgrp.h (pwdgrp_check::pwdgrp_state): Replace by
pwdgrp_check::isinitializing ().
(pwdgrp_check::isinitializing): Create.
* passwd.cc (grab_int): Change type to unsigned, use strtoul and
set the pointer content to 0 if the field is invalid.
(parse_pwd): Move validity test after getting pw_gid.
(read_etc_passwd): Replace "passwd_state <= " by
passwd_state::isinitializing ().
(internal_getpwuid): Ditto.
(internal_getpwnam): Ditto.
(getpwent): Ditto.
(getpass): Ditto.
* grp.cc (parse_grp): Use strtoul for gr_gid and verify the validity.
(read_etc_group): Replace "group_state <= " by
group_state::isinitializing ().
(internal_getgrgid): Ditto.
(getgrent32): Ditto.
(internal_getgrent): Ditto.
2002-12-10 Pierre Humblet <pierre.humblet@ieee.org>
* security.h: Move declarations of internal_getgrent,
internal_getpwsid and internal_getgrsid to pwdgrp.h.
* pwdgrp.h: Declare internal_getpwsid, internal_getpwnam,
internal_getpwuid, internal_getgrsid, internal_getgrgid,
internal_getgrnam, internal_getgrent and internal_getgroups.
Delete "emulated" from enum pwdgrp_state.
(pwdgrp_check::isuninitialized): Create.
(pwdgrp_check::pwdgrp_state): Change state to initializing
rather than to uninitialized.
(pwdgrp_read::gets): Remove trailing CRs.
* passwd.cc (grab_string): Don't look for NLs.
(grab_int): Ditto.
(parse_pwd): Don't look for CRs. Return 0 if entry is too short.
(search_for): Delete.
(read_etc_passwd): Simplify tests to actually read the file.
Set state to loaded before making internal_getpwXX calls.
Replace search_for calls by equivalent internal_pwgetXX calls.
(internal_getpwsid): Use passwd_state.isuninitialized to decide
to call read_etc_passwd.
(internal_getpwuid): Create.
(internal_getpwnam): Create.
(getpwuid32): Simply call internal_getpwuid.
(getpwuid_r32): Call internal_getpwuid.
(getpwnam): Simply call internal_getpwnam.
(getpwnam_r): Call internal_getpwnam.
* grp.cc (parse_grp): Don't look for CRs. Adjust blank space.
(add_grp_line): Adjust blank space.
(class group_lock): Ditto.
(read_etc_group): Simplify tests to actually read the file.
Set state to loaded before making internal_getgrXX calls.
Replace getgrXX calls by equivalent internal calls.
(internal_getgrsid): Use group_state.isuninitialized to decide
to call read_etc_group.
(internal_getgrgid): Create.
(internal_getgrnam): Create.
(getgroups32): Simply call internal_getgrgid.
(getgrnam32): Simply call internal_getgrnam.
(internal_getgrent): Call group_state.isuninitialized.
(internal_getgroups): Create from the former getgroups32, using
two of the four arguments. Set gid to myself->gid and username
to cygheap->user.name ().
(getgroups32): Simply call internal_getgroup.
(getgroups): Call internal_getgroup instead of getgroups32.
(setgroups32): Call internal versions of get{pw,gr}XX.
* sec_helper.cc: Include pwdgrp.h.
(is_grp_member): Call internal versions of get{pw,gr}XX.
* security.cc: Include pwdgrp.h.
(alloc_sd): Call internal versions of get{pw,gr}XX.
* syscalls.cc: Include pwdgrp.h.
(seteuid32): Call internal versions of get{pw,gr}XX.
(setegid32): Ditto.
* uinfo.cc: Include pwdgrp.h.
(internal_getlogin): Call internal versions of get{pw,gr}XX.
(cygheap_user::ontherange): Ditto.
* sec_acl.cc: Include pwdgrp.h.
(setacl): Call internal versions of get{pw,gr}XX.
(acl_access): Ditto and simplify logic.
(aclfromtext): Ditto.
2002-12-10 20:43:49 +08:00
|
|
|
{
|
2003-01-21 14:58:11 +08:00
|
|
|
pr.refresh (check);
|
2000-02-18 03:38:33 +08:00
|
|
|
|
2003-01-20 10:57:54 +08:00
|
|
|
for (int i = 0; i < pr.curr_lines; i++)
|
2002-12-10 Pierre Humblet <pierre.humblet@ieee.org>
* pwdgrp.h (pwdgrp_check::pwdgrp_state): Replace by
pwdgrp_check::isinitializing ().
(pwdgrp_check::isinitializing): Create.
* passwd.cc (grab_int): Change type to unsigned, use strtoul and
set the pointer content to 0 if the field is invalid.
(parse_pwd): Move validity test after getting pw_gid.
(read_etc_passwd): Replace "passwd_state <= " by
passwd_state::isinitializing ().
(internal_getpwuid): Ditto.
(internal_getpwnam): Ditto.
(getpwent): Ditto.
(getpass): Ditto.
* grp.cc (parse_grp): Use strtoul for gr_gid and verify the validity.
(read_etc_group): Replace "group_state <= " by
group_state::isinitializing ().
(internal_getgrgid): Ditto.
(getgrent32): Ditto.
(internal_getgrent): Ditto.
2002-12-10 Pierre Humblet <pierre.humblet@ieee.org>
* security.h: Move declarations of internal_getgrent,
internal_getpwsid and internal_getgrsid to pwdgrp.h.
* pwdgrp.h: Declare internal_getpwsid, internal_getpwnam,
internal_getpwuid, internal_getgrsid, internal_getgrgid,
internal_getgrnam, internal_getgrent and internal_getgroups.
Delete "emulated" from enum pwdgrp_state.
(pwdgrp_check::isuninitialized): Create.
(pwdgrp_check::pwdgrp_state): Change state to initializing
rather than to uninitialized.
(pwdgrp_read::gets): Remove trailing CRs.
* passwd.cc (grab_string): Don't look for NLs.
(grab_int): Ditto.
(parse_pwd): Don't look for CRs. Return 0 if entry is too short.
(search_for): Delete.
(read_etc_passwd): Simplify tests to actually read the file.
Set state to loaded before making internal_getpwXX calls.
Replace search_for calls by equivalent internal_pwgetXX calls.
(internal_getpwsid): Use passwd_state.isuninitialized to decide
to call read_etc_passwd.
(internal_getpwuid): Create.
(internal_getpwnam): Create.
(getpwuid32): Simply call internal_getpwuid.
(getpwuid_r32): Call internal_getpwuid.
(getpwnam): Simply call internal_getpwnam.
(getpwnam_r): Call internal_getpwnam.
* grp.cc (parse_grp): Don't look for CRs. Adjust blank space.
(add_grp_line): Adjust blank space.
(class group_lock): Ditto.
(read_etc_group): Simplify tests to actually read the file.
Set state to loaded before making internal_getgrXX calls.
Replace getgrXX calls by equivalent internal calls.
(internal_getgrsid): Use group_state.isuninitialized to decide
to call read_etc_group.
(internal_getgrgid): Create.
(internal_getgrnam): Create.
(getgroups32): Simply call internal_getgrgid.
(getgrnam32): Simply call internal_getgrnam.
(internal_getgrent): Call group_state.isuninitialized.
(internal_getgroups): Create from the former getgroups32, using
two of the four arguments. Set gid to myself->gid and username
to cygheap->user.name ().
(getgroups32): Simply call internal_getgroup.
(getgroups): Call internal_getgroup instead of getgroups32.
(setgroups32): Call internal versions of get{pw,gr}XX.
* sec_helper.cc: Include pwdgrp.h.
(is_grp_member): Call internal versions of get{pw,gr}XX.
* security.cc: Include pwdgrp.h.
(alloc_sd): Call internal versions of get{pw,gr}XX.
* syscalls.cc: Include pwdgrp.h.
(seteuid32): Call internal versions of get{pw,gr}XX.
(setegid32): Ditto.
* uinfo.cc: Include pwdgrp.h.
(internal_getlogin): Call internal versions of get{pw,gr}XX.
(cygheap_user::ontherange): Ditto.
* sec_acl.cc: Include pwdgrp.h.
(setacl): Call internal versions of get{pw,gr}XX.
(acl_access): Ditto and simplify logic.
(aclfromtext): Ditto.
2002-12-10 20:43:49 +08:00
|
|
|
/* on Windows NT user names are case-insensitive */
|
|
|
|
if (strcasematch (name, passwd_buf[i].pw_name))
|
|
|
|
return passwd_buf + i;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
extern "C" struct passwd *
|
|
|
|
getpwuid32 (__uid32_t uid)
|
|
|
|
{
|
|
|
|
struct passwd *temppw = internal_getpwuid (uid, TRUE);
|
|
|
|
pthread_testcancel ();
|
|
|
|
return temppw;
|
2000-02-18 03:38:33 +08:00
|
|
|
}
|
|
|
|
|
2002-05-29 23:04:29 +08:00
|
|
|
extern "C" struct passwd *
|
|
|
|
getpwuid (__uid16_t uid)
|
|
|
|
{
|
|
|
|
return getpwuid32 (uid16touid32 (uid));
|
|
|
|
}
|
|
|
|
|
2001-06-26 22:47:48 +08:00
|
|
|
extern "C" int
|
2002-05-29 23:04:29 +08:00
|
|
|
getpwuid_r32 (__uid32_t uid, struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result)
|
2001-04-19 05:10:15 +08:00
|
|
|
{
|
|
|
|
*result = NULL;
|
|
|
|
|
|
|
|
if (!pwd || !buffer)
|
|
|
|
return ERANGE;
|
|
|
|
|
2002-12-10 Pierre Humblet <pierre.humblet@ieee.org>
* pwdgrp.h (pwdgrp_check::pwdgrp_state): Replace by
pwdgrp_check::isinitializing ().
(pwdgrp_check::isinitializing): Create.
* passwd.cc (grab_int): Change type to unsigned, use strtoul and
set the pointer content to 0 if the field is invalid.
(parse_pwd): Move validity test after getting pw_gid.
(read_etc_passwd): Replace "passwd_state <= " by
passwd_state::isinitializing ().
(internal_getpwuid): Ditto.
(internal_getpwnam): Ditto.
(getpwent): Ditto.
(getpass): Ditto.
* grp.cc (parse_grp): Use strtoul for gr_gid and verify the validity.
(read_etc_group): Replace "group_state <= " by
group_state::isinitializing ().
(internal_getgrgid): Ditto.
(getgrent32): Ditto.
(internal_getgrent): Ditto.
2002-12-10 Pierre Humblet <pierre.humblet@ieee.org>
* security.h: Move declarations of internal_getgrent,
internal_getpwsid and internal_getgrsid to pwdgrp.h.
* pwdgrp.h: Declare internal_getpwsid, internal_getpwnam,
internal_getpwuid, internal_getgrsid, internal_getgrgid,
internal_getgrnam, internal_getgrent and internal_getgroups.
Delete "emulated" from enum pwdgrp_state.
(pwdgrp_check::isuninitialized): Create.
(pwdgrp_check::pwdgrp_state): Change state to initializing
rather than to uninitialized.
(pwdgrp_read::gets): Remove trailing CRs.
* passwd.cc (grab_string): Don't look for NLs.
(grab_int): Ditto.
(parse_pwd): Don't look for CRs. Return 0 if entry is too short.
(search_for): Delete.
(read_etc_passwd): Simplify tests to actually read the file.
Set state to loaded before making internal_getpwXX calls.
Replace search_for calls by equivalent internal_pwgetXX calls.
(internal_getpwsid): Use passwd_state.isuninitialized to decide
to call read_etc_passwd.
(internal_getpwuid): Create.
(internal_getpwnam): Create.
(getpwuid32): Simply call internal_getpwuid.
(getpwuid_r32): Call internal_getpwuid.
(getpwnam): Simply call internal_getpwnam.
(getpwnam_r): Call internal_getpwnam.
* grp.cc (parse_grp): Don't look for CRs. Adjust blank space.
(add_grp_line): Adjust blank space.
(class group_lock): Ditto.
(read_etc_group): Simplify tests to actually read the file.
Set state to loaded before making internal_getgrXX calls.
Replace getgrXX calls by equivalent internal calls.
(internal_getgrsid): Use group_state.isuninitialized to decide
to call read_etc_group.
(internal_getgrgid): Create.
(internal_getgrnam): Create.
(getgroups32): Simply call internal_getgrgid.
(getgrnam32): Simply call internal_getgrnam.
(internal_getgrent): Call group_state.isuninitialized.
(internal_getgroups): Create from the former getgroups32, using
two of the four arguments. Set gid to myself->gid and username
to cygheap->user.name ().
(getgroups32): Simply call internal_getgroup.
(getgroups): Call internal_getgroup instead of getgroups32.
(setgroups32): Call internal versions of get{pw,gr}XX.
* sec_helper.cc: Include pwdgrp.h.
(is_grp_member): Call internal versions of get{pw,gr}XX.
* security.cc: Include pwdgrp.h.
(alloc_sd): Call internal versions of get{pw,gr}XX.
* syscalls.cc: Include pwdgrp.h.
(seteuid32): Call internal versions of get{pw,gr}XX.
(setegid32): Ditto.
* uinfo.cc: Include pwdgrp.h.
(internal_getlogin): Call internal versions of get{pw,gr}XX.
(cygheap_user::ontherange): Ditto.
* sec_acl.cc: Include pwdgrp.h.
(setacl): Call internal versions of get{pw,gr}XX.
(acl_access): Ditto and simplify logic.
(aclfromtext): Ditto.
2002-12-10 20:43:49 +08:00
|
|
|
struct passwd *temppw = internal_getpwuid (uid, TRUE);
|
2002-09-22 11:38:57 +08:00
|
|
|
pthread_testcancel ();
|
2001-04-19 05:10:15 +08:00
|
|
|
if (!temppw)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* check needed buffer size. */
|
2001-04-25 05:45:20 +08:00
|
|
|
size_t needsize = strlen (temppw->pw_name) + strlen (temppw->pw_dir) +
|
2001-06-26 22:47:48 +08:00
|
|
|
strlen (temppw->pw_shell) + strlen (temppw->pw_gecos) +
|
2003-01-02 08:03:23 +08:00
|
|
|
strlen (temppw->pw_passwd) + 5;
|
2001-04-19 05:10:15 +08:00
|
|
|
if (needsize > bufsize)
|
|
|
|
return ERANGE;
|
|
|
|
|
|
|
|
/* make a copy of temppw */
|
|
|
|
*result = pwd;
|
|
|
|
pwd->pw_uid = temppw->pw_uid;
|
|
|
|
pwd->pw_gid = temppw->pw_gid;
|
|
|
|
pwd->pw_name = buffer;
|
2001-04-25 05:45:20 +08:00
|
|
|
pwd->pw_dir = pwd->pw_name + strlen (temppw->pw_name) + 1;
|
|
|
|
pwd->pw_shell = pwd->pw_dir + strlen (temppw->pw_dir) + 1;
|
|
|
|
pwd->pw_gecos = pwd->pw_shell + strlen (temppw->pw_shell) + 1;
|
2003-09-09 05:44:53 +08:00
|
|
|
pwd->pw_comment = NULL;
|
2001-04-25 05:52:57 +08:00
|
|
|
pwd->pw_passwd = pwd->pw_gecos + strlen (temppw->pw_gecos) + 1;
|
2001-04-19 05:10:15 +08:00
|
|
|
strcpy (pwd->pw_name, temppw->pw_name);
|
|
|
|
strcpy (pwd->pw_dir, temppw->pw_dir);
|
|
|
|
strcpy (pwd->pw_shell, temppw->pw_shell);
|
2001-04-25 05:45:20 +08:00
|
|
|
strcpy (pwd->pw_gecos, temppw->pw_gecos);
|
2001-04-25 05:52:57 +08:00
|
|
|
strcpy (pwd->pw_passwd, temppw->pw_passwd);
|
2001-04-19 05:10:15 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-05-29 23:04:29 +08:00
|
|
|
extern "C" int
|
|
|
|
getpwuid_r (__uid16_t uid, struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result)
|
|
|
|
{
|
|
|
|
return getpwuid_r32 (uid16touid32 (uid), pwd, buffer, bufsize, result);
|
|
|
|
}
|
|
|
|
|
2000-02-21 13:20:38 +08:00
|
|
|
extern "C" struct passwd *
|
2000-02-18 03:38:33 +08:00
|
|
|
getpwnam (const char *name)
|
|
|
|
{
|
2002-12-10 Pierre Humblet <pierre.humblet@ieee.org>
* pwdgrp.h (pwdgrp_check::pwdgrp_state): Replace by
pwdgrp_check::isinitializing ().
(pwdgrp_check::isinitializing): Create.
* passwd.cc (grab_int): Change type to unsigned, use strtoul and
set the pointer content to 0 if the field is invalid.
(parse_pwd): Move validity test after getting pw_gid.
(read_etc_passwd): Replace "passwd_state <= " by
passwd_state::isinitializing ().
(internal_getpwuid): Ditto.
(internal_getpwnam): Ditto.
(getpwent): Ditto.
(getpass): Ditto.
* grp.cc (parse_grp): Use strtoul for gr_gid and verify the validity.
(read_etc_group): Replace "group_state <= " by
group_state::isinitializing ().
(internal_getgrgid): Ditto.
(getgrent32): Ditto.
(internal_getgrent): Ditto.
2002-12-10 Pierre Humblet <pierre.humblet@ieee.org>
* security.h: Move declarations of internal_getgrent,
internal_getpwsid and internal_getgrsid to pwdgrp.h.
* pwdgrp.h: Declare internal_getpwsid, internal_getpwnam,
internal_getpwuid, internal_getgrsid, internal_getgrgid,
internal_getgrnam, internal_getgrent and internal_getgroups.
Delete "emulated" from enum pwdgrp_state.
(pwdgrp_check::isuninitialized): Create.
(pwdgrp_check::pwdgrp_state): Change state to initializing
rather than to uninitialized.
(pwdgrp_read::gets): Remove trailing CRs.
* passwd.cc (grab_string): Don't look for NLs.
(grab_int): Ditto.
(parse_pwd): Don't look for CRs. Return 0 if entry is too short.
(search_for): Delete.
(read_etc_passwd): Simplify tests to actually read the file.
Set state to loaded before making internal_getpwXX calls.
Replace search_for calls by equivalent internal_pwgetXX calls.
(internal_getpwsid): Use passwd_state.isuninitialized to decide
to call read_etc_passwd.
(internal_getpwuid): Create.
(internal_getpwnam): Create.
(getpwuid32): Simply call internal_getpwuid.
(getpwuid_r32): Call internal_getpwuid.
(getpwnam): Simply call internal_getpwnam.
(getpwnam_r): Call internal_getpwnam.
* grp.cc (parse_grp): Don't look for CRs. Adjust blank space.
(add_grp_line): Adjust blank space.
(class group_lock): Ditto.
(read_etc_group): Simplify tests to actually read the file.
Set state to loaded before making internal_getgrXX calls.
Replace getgrXX calls by equivalent internal calls.
(internal_getgrsid): Use group_state.isuninitialized to decide
to call read_etc_group.
(internal_getgrgid): Create.
(internal_getgrnam): Create.
(getgroups32): Simply call internal_getgrgid.
(getgrnam32): Simply call internal_getgrnam.
(internal_getgrent): Call group_state.isuninitialized.
(internal_getgroups): Create from the former getgroups32, using
two of the four arguments. Set gid to myself->gid and username
to cygheap->user.name ().
(getgroups32): Simply call internal_getgroup.
(getgroups): Call internal_getgroup instead of getgroups32.
(setgroups32): Call internal versions of get{pw,gr}XX.
* sec_helper.cc: Include pwdgrp.h.
(is_grp_member): Call internal versions of get{pw,gr}XX.
* security.cc: Include pwdgrp.h.
(alloc_sd): Call internal versions of get{pw,gr}XX.
* syscalls.cc: Include pwdgrp.h.
(seteuid32): Call internal versions of get{pw,gr}XX.
(setegid32): Ditto.
* uinfo.cc: Include pwdgrp.h.
(internal_getlogin): Call internal versions of get{pw,gr}XX.
(cygheap_user::ontherange): Ditto.
* sec_acl.cc: Include pwdgrp.h.
(setacl): Call internal versions of get{pw,gr}XX.
(acl_access): Ditto and simplify logic.
(aclfromtext): Ditto.
2002-12-10 20:43:49 +08:00
|
|
|
struct passwd *temppw = internal_getpwnam (name, TRUE);
|
2002-09-22 11:38:57 +08:00
|
|
|
pthread_testcancel ();
|
2002-12-10 Pierre Humblet <pierre.humblet@ieee.org>
* pwdgrp.h (pwdgrp_check::pwdgrp_state): Replace by
pwdgrp_check::isinitializing ().
(pwdgrp_check::isinitializing): Create.
* passwd.cc (grab_int): Change type to unsigned, use strtoul and
set the pointer content to 0 if the field is invalid.
(parse_pwd): Move validity test after getting pw_gid.
(read_etc_passwd): Replace "passwd_state <= " by
passwd_state::isinitializing ().
(internal_getpwuid): Ditto.
(internal_getpwnam): Ditto.
(getpwent): Ditto.
(getpass): Ditto.
* grp.cc (parse_grp): Use strtoul for gr_gid and verify the validity.
(read_etc_group): Replace "group_state <= " by
group_state::isinitializing ().
(internal_getgrgid): Ditto.
(getgrent32): Ditto.
(internal_getgrent): Ditto.
2002-12-10 Pierre Humblet <pierre.humblet@ieee.org>
* security.h: Move declarations of internal_getgrent,
internal_getpwsid and internal_getgrsid to pwdgrp.h.
* pwdgrp.h: Declare internal_getpwsid, internal_getpwnam,
internal_getpwuid, internal_getgrsid, internal_getgrgid,
internal_getgrnam, internal_getgrent and internal_getgroups.
Delete "emulated" from enum pwdgrp_state.
(pwdgrp_check::isuninitialized): Create.
(pwdgrp_check::pwdgrp_state): Change state to initializing
rather than to uninitialized.
(pwdgrp_read::gets): Remove trailing CRs.
* passwd.cc (grab_string): Don't look for NLs.
(grab_int): Ditto.
(parse_pwd): Don't look for CRs. Return 0 if entry is too short.
(search_for): Delete.
(read_etc_passwd): Simplify tests to actually read the file.
Set state to loaded before making internal_getpwXX calls.
Replace search_for calls by equivalent internal_pwgetXX calls.
(internal_getpwsid): Use passwd_state.isuninitialized to decide
to call read_etc_passwd.
(internal_getpwuid): Create.
(internal_getpwnam): Create.
(getpwuid32): Simply call internal_getpwuid.
(getpwuid_r32): Call internal_getpwuid.
(getpwnam): Simply call internal_getpwnam.
(getpwnam_r): Call internal_getpwnam.
* grp.cc (parse_grp): Don't look for CRs. Adjust blank space.
(add_grp_line): Adjust blank space.
(class group_lock): Ditto.
(read_etc_group): Simplify tests to actually read the file.
Set state to loaded before making internal_getgrXX calls.
Replace getgrXX calls by equivalent internal calls.
(internal_getgrsid): Use group_state.isuninitialized to decide
to call read_etc_group.
(internal_getgrgid): Create.
(internal_getgrnam): Create.
(getgroups32): Simply call internal_getgrgid.
(getgrnam32): Simply call internal_getgrnam.
(internal_getgrent): Call group_state.isuninitialized.
(internal_getgroups): Create from the former getgroups32, using
two of the four arguments. Set gid to myself->gid and username
to cygheap->user.name ().
(getgroups32): Simply call internal_getgroup.
(getgroups): Call internal_getgroup instead of getgroups32.
(setgroups32): Call internal versions of get{pw,gr}XX.
* sec_helper.cc: Include pwdgrp.h.
(is_grp_member): Call internal versions of get{pw,gr}XX.
* security.cc: Include pwdgrp.h.
(alloc_sd): Call internal versions of get{pw,gr}XX.
* syscalls.cc: Include pwdgrp.h.
(seteuid32): Call internal versions of get{pw,gr}XX.
(setegid32): Ditto.
* uinfo.cc: Include pwdgrp.h.
(internal_getlogin): Call internal versions of get{pw,gr}XX.
(cygheap_user::ontherange): Ditto.
* sec_acl.cc: Include pwdgrp.h.
(setacl): Call internal versions of get{pw,gr}XX.
(acl_access): Ditto and simplify logic.
(aclfromtext): Ditto.
2002-12-10 20:43:49 +08:00
|
|
|
return temppw;
|
2000-02-18 03:38:33 +08:00
|
|
|
}
|
|
|
|
|
2001-04-19 05:10:15 +08:00
|
|
|
|
2001-06-26 22:47:48 +08:00
|
|
|
/* the max size buffer we can expect to
|
2001-04-19 05:10:15 +08:00
|
|
|
* use is returned via sysconf with _SC_GETPW_R_SIZE_MAX.
|
|
|
|
* This may need updating! - Rob Collins April 2001.
|
|
|
|
*/
|
|
|
|
extern "C" int
|
|
|
|
getpwnam_r (const char *nam, struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result)
|
|
|
|
{
|
|
|
|
*result = NULL;
|
|
|
|
|
|
|
|
if (!pwd || !buffer || !nam)
|
|
|
|
return ERANGE;
|
|
|
|
|
2002-12-10 Pierre Humblet <pierre.humblet@ieee.org>
* pwdgrp.h (pwdgrp_check::pwdgrp_state): Replace by
pwdgrp_check::isinitializing ().
(pwdgrp_check::isinitializing): Create.
* passwd.cc (grab_int): Change type to unsigned, use strtoul and
set the pointer content to 0 if the field is invalid.
(parse_pwd): Move validity test after getting pw_gid.
(read_etc_passwd): Replace "passwd_state <= " by
passwd_state::isinitializing ().
(internal_getpwuid): Ditto.
(internal_getpwnam): Ditto.
(getpwent): Ditto.
(getpass): Ditto.
* grp.cc (parse_grp): Use strtoul for gr_gid and verify the validity.
(read_etc_group): Replace "group_state <= " by
group_state::isinitializing ().
(internal_getgrgid): Ditto.
(getgrent32): Ditto.
(internal_getgrent): Ditto.
2002-12-10 Pierre Humblet <pierre.humblet@ieee.org>
* security.h: Move declarations of internal_getgrent,
internal_getpwsid and internal_getgrsid to pwdgrp.h.
* pwdgrp.h: Declare internal_getpwsid, internal_getpwnam,
internal_getpwuid, internal_getgrsid, internal_getgrgid,
internal_getgrnam, internal_getgrent and internal_getgroups.
Delete "emulated" from enum pwdgrp_state.
(pwdgrp_check::isuninitialized): Create.
(pwdgrp_check::pwdgrp_state): Change state to initializing
rather than to uninitialized.
(pwdgrp_read::gets): Remove trailing CRs.
* passwd.cc (grab_string): Don't look for NLs.
(grab_int): Ditto.
(parse_pwd): Don't look for CRs. Return 0 if entry is too short.
(search_for): Delete.
(read_etc_passwd): Simplify tests to actually read the file.
Set state to loaded before making internal_getpwXX calls.
Replace search_for calls by equivalent internal_pwgetXX calls.
(internal_getpwsid): Use passwd_state.isuninitialized to decide
to call read_etc_passwd.
(internal_getpwuid): Create.
(internal_getpwnam): Create.
(getpwuid32): Simply call internal_getpwuid.
(getpwuid_r32): Call internal_getpwuid.
(getpwnam): Simply call internal_getpwnam.
(getpwnam_r): Call internal_getpwnam.
* grp.cc (parse_grp): Don't look for CRs. Adjust blank space.
(add_grp_line): Adjust blank space.
(class group_lock): Ditto.
(read_etc_group): Simplify tests to actually read the file.
Set state to loaded before making internal_getgrXX calls.
Replace getgrXX calls by equivalent internal calls.
(internal_getgrsid): Use group_state.isuninitialized to decide
to call read_etc_group.
(internal_getgrgid): Create.
(internal_getgrnam): Create.
(getgroups32): Simply call internal_getgrgid.
(getgrnam32): Simply call internal_getgrnam.
(internal_getgrent): Call group_state.isuninitialized.
(internal_getgroups): Create from the former getgroups32, using
two of the four arguments. Set gid to myself->gid and username
to cygheap->user.name ().
(getgroups32): Simply call internal_getgroup.
(getgroups): Call internal_getgroup instead of getgroups32.
(setgroups32): Call internal versions of get{pw,gr}XX.
* sec_helper.cc: Include pwdgrp.h.
(is_grp_member): Call internal versions of get{pw,gr}XX.
* security.cc: Include pwdgrp.h.
(alloc_sd): Call internal versions of get{pw,gr}XX.
* syscalls.cc: Include pwdgrp.h.
(seteuid32): Call internal versions of get{pw,gr}XX.
(setegid32): Ditto.
* uinfo.cc: Include pwdgrp.h.
(internal_getlogin): Call internal versions of get{pw,gr}XX.
(cygheap_user::ontherange): Ditto.
* sec_acl.cc: Include pwdgrp.h.
(setacl): Call internal versions of get{pw,gr}XX.
(acl_access): Ditto and simplify logic.
(aclfromtext): Ditto.
2002-12-10 20:43:49 +08:00
|
|
|
struct passwd *temppw = internal_getpwnam (nam, TRUE);
|
2002-09-22 11:38:57 +08:00
|
|
|
pthread_testcancel ();
|
2001-04-21 22:23:47 +08:00
|
|
|
|
2001-04-19 05:10:15 +08:00
|
|
|
if (!temppw)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* check needed buffer size. */
|
2001-04-25 05:45:20 +08:00
|
|
|
size_t needsize = strlen (temppw->pw_name) + strlen (temppw->pw_dir) +
|
2001-06-26 22:47:48 +08:00
|
|
|
strlen (temppw->pw_shell) + strlen (temppw->pw_gecos) +
|
2001-04-25 05:52:57 +08:00
|
|
|
strlen (temppw->pw_passwd) + 5;
|
2001-04-19 05:10:15 +08:00
|
|
|
if (needsize > bufsize)
|
|
|
|
return ERANGE;
|
2001-06-26 22:47:48 +08:00
|
|
|
|
2001-04-19 05:10:15 +08:00
|
|
|
/* make a copy of temppw */
|
|
|
|
*result = pwd;
|
|
|
|
pwd->pw_uid = temppw->pw_uid;
|
|
|
|
pwd->pw_gid = temppw->pw_gid;
|
|
|
|
pwd->pw_name = buffer;
|
2001-04-25 05:45:20 +08:00
|
|
|
pwd->pw_dir = pwd->pw_name + strlen (temppw->pw_name) + 1;
|
|
|
|
pwd->pw_shell = pwd->pw_dir + strlen (temppw->pw_dir) + 1;
|
|
|
|
pwd->pw_gecos = pwd->pw_shell + strlen (temppw->pw_shell) + 1;
|
2003-09-09 06:03:20 +08:00
|
|
|
pwd->pw_comment = NULL;
|
2001-04-25 05:52:57 +08:00
|
|
|
pwd->pw_passwd = pwd->pw_gecos + strlen (temppw->pw_gecos) + 1;
|
2001-04-19 05:10:15 +08:00
|
|
|
strcpy (pwd->pw_name, temppw->pw_name);
|
|
|
|
strcpy (pwd->pw_dir, temppw->pw_dir);
|
|
|
|
strcpy (pwd->pw_shell, temppw->pw_shell);
|
2001-04-25 05:45:20 +08:00
|
|
|
strcpy (pwd->pw_gecos, temppw->pw_gecos);
|
2001-04-25 05:52:57 +08:00
|
|
|
strcpy (pwd->pw_passwd, temppw->pw_passwd);
|
2001-04-19 05:10:15 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2000-02-21 13:20:38 +08:00
|
|
|
extern "C" struct passwd *
|
2000-02-18 03:38:33 +08:00
|
|
|
getpwent (void)
|
|
|
|
{
|
2003-02-02 02:41:29 +08:00
|
|
|
if (pw_pos == 0)
|
|
|
|
pr.refresh (true);
|
2003-01-20 10:57:54 +08:00
|
|
|
if (pw_pos < pr.curr_lines)
|
2000-02-18 03:38:33 +08:00
|
|
|
return passwd_buf + pw_pos++;
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2000-02-21 13:20:38 +08:00
|
|
|
extern "C" struct passwd *
|
* (child_info.h, cygheap.h, dcrt0.cc, dir.cc, fhandler.cc, fhandler.h,
fhandler_clipboard.cc, fhandler_disk_file.cc, fhandler_dsp.cc,
fhandler_floppy.cc, fhandler_mem.cc, fhandler_random.cc,
fhandler_tape.cc, fhandler_zero.cc, grp.cc, mmap.cc, passwd.cc,
pinfo.cc, pinfo.h, pipe.cc, sec_acl.cc, sec_helper.cc, security.cc,
security.h, spawn.cc, syscalls.cc, thread.h, uinfo.cc, winsup.h):
Change usage of uid_t to __uid16_t, gid_t to __gid16_t and
off_t to __off32_t throughout. Use INVALID_UID, INVALID_GID and
INVALID_SEEK instead casting -1 to the appropriate type.
* winsup.h: Define INVALID_UID, INVALID_GID and INVALID_SEEK.
* include/cygwin/acl.h: Define internal __aclent16_t and __aclent32_t
types. Don't declare acl functions when compiling Cygwin.
* include/cygwin/grp.h: Declare getgrgid() and getgrnam() with
correct types for internal usage.
2002-02-10 21:38:51 +08:00
|
|
|
getpwduid (__uid16_t)
|
2000-02-18 03:38:33 +08:00
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2000-02-21 13:20:38 +08:00
|
|
|
extern "C" void
|
2000-02-18 03:38:33 +08:00
|
|
|
setpwent (void)
|
|
|
|
{
|
|
|
|
pw_pos = 0;
|
|
|
|
}
|
|
|
|
|
2000-02-21 13:20:38 +08:00
|
|
|
extern "C" void
|
2000-02-18 03:38:33 +08:00
|
|
|
endpwent (void)
|
|
|
|
{
|
|
|
|
pw_pos = 0;
|
|
|
|
}
|
|
|
|
|
2000-02-21 13:20:38 +08:00
|
|
|
extern "C" int
|
2000-02-18 03:38:33 +08:00
|
|
|
setpassent ()
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2000-02-21 13:20:38 +08:00
|
|
|
extern "C" char *
|
2000-02-18 03:38:33 +08:00
|
|
|
getpass (const char * prompt)
|
|
|
|
{
|
2001-01-28 13:51:15 +08:00
|
|
|
char *pass=_reent_winsup ()->_pass;
|
2000-02-18 03:38:33 +08:00
|
|
|
struct termios ti, newti;
|
|
|
|
|
2001-10-16 07:39:33 +08:00
|
|
|
cygheap_fdget fhstdin (0);
|
|
|
|
|
|
|
|
if (fhstdin < 0)
|
|
|
|
pass[0] = '\0';
|
2000-02-18 03:38:33 +08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
fhstdin->tcgetattr (&ti);
|
|
|
|
newti = ti;
|
|
|
|
newti.c_lflag &= ~ECHO;
|
|
|
|
fhstdin->tcsetattr (TCSANOW, &newti);
|
|
|
|
fputs (prompt, stderr);
|
|
|
|
fgets (pass, _PASSWORD_LEN, stdin);
|
|
|
|
fprintf (stderr, "\n");
|
|
|
|
for (int i=0; pass[i]; i++)
|
|
|
|
if (pass[i] == '\r' || pass[i] == '\n')
|
|
|
|
pass[i] = '\0';
|
|
|
|
fhstdin->tcsetattr (TCSANOW, &ti);
|
|
|
|
}
|
|
|
|
return pass;
|
|
|
|
}
|