aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2003-09-10 19:13:05 +0000
committerCorinna Vinschen <corinna@vinschen.de>2003-09-10 19:13:05 +0000
commit932a40e86b8472fb8881a71ef8f139a6ba9d0e42 (patch)
treec2e9b265e2faab499e00d5a71c453dfecab22f6e
parent6d2d2bce720d5c455b77f1139d623ccca8a924e8 (diff)
downloadnewlib-932a40e86b8472fb8881a71ef8f139a6ba9d0e42.zip
newlib-932a40e86b8472fb8881a71ef8f139a6ba9d0e42.tar.gz
newlib-932a40e86b8472fb8881a71ef8f139a6ba9d0e42.tar.bz2
* Makefile.in (DLL_OFILES): Add getopt.o and iruserok.o.
* cygwin.din: Export __check_rhosts_file, __rcmd_errstr, optarg, opterr, optind, optopt, optreset, getopt, getopt_long, iruserok and ruserok. * getopt.c: Moved from lib to here. Define opt* variables as dllexport. * iruserok.c: Moved from lib to here. Rearrange function order. Prefer using 64/32 bit functions. * syscalls.cc (shell_fp): Define as struct __sFILE64. (getusershell): Use fopen64 instead of fopen. * winsup.h: Add declarations for seteuid32, fopen64, cygwin_gethostbyname and cygwin_inet_addr. * include/getopt.h: Declare opt* variables dllimport. * include/cygwin/version.h: Bump API minor number.
-rw-r--r--winsup/cygwin/ChangeLog17
-rw-r--r--winsup/cygwin/Makefile.in20
-rw-r--r--winsup/cygwin/cygwin.din11
-rw-r--r--winsup/cygwin/include/cygwin/version.h4
-rw-r--r--winsup/cygwin/include/getopt.h12
-rw-r--r--winsup/cygwin/libc/getopt.c (renamed from winsup/cygwin/lib/getopt.c)13
-rw-r--r--winsup/cygwin/libc/iruserok.c (renamed from winsup/cygwin/lib/iruserok.c)301
-rw-r--r--winsup/cygwin/syscalls.cc4
-rw-r--r--winsup/cygwin/winsup.h8
9 files changed, 190 insertions, 200 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index c3419cd..023e638 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,20 @@
+2003-09-10 Corinna Vinschen <corinna@vinschen.de>
+
+ * Makefile.in (DLL_OFILES): Add getopt.o and iruserok.o.
+ * cygwin.din: Export __check_rhosts_file, __rcmd_errstr, optarg,
+ opterr, optind, optopt, optreset, getopt, getopt_long, iruserok
+ and ruserok.
+ * getopt.c: Moved from lib to here. Define opt* variables as
+ dllexport.
+ * iruserok.c: Moved from lib to here. Rearrange function order.
+ Prefer using 64/32 bit functions.
+ * syscalls.cc (shell_fp): Define as struct __sFILE64.
+ (getusershell): Use fopen64 instead of fopen.
+ * winsup.h: Add declarations for seteuid32, fopen64,
+ cygwin_gethostbyname and cygwin_inet_addr.
+ * include/getopt.h: Declare opt* variables dllimport.
+ * include/cygwin/version.h: Bump API minor number.
+
2003-09-10 Christopher Faylor <cgf@redhat.com>
* exceptions.cc (sig_handle_tty_stop): Check parent PID_NOCLDSTOP
diff --git a/winsup/cygwin/Makefile.in b/winsup/cygwin/Makefile.in
index 5045b1f..785b207 100644
--- a/winsup/cygwin/Makefile.in
+++ b/winsup/cygwin/Makefile.in
@@ -146,7 +146,7 @@ MALLOC_OFILES=@MALLOC_OFILES@
DLL_IMPORTS:=$(w32api_lib)/libkernel32.a
# Please maintain this list in sorted order, with maximum files per 80 col line
-DLL_OFILES:=assert.o autoload.o cxx.o bsdlib.o cygheap.o cygthread.o dcrt0.o \
+DLL_OFILES:=assert.o autoload.o bsdlib.o cxx.o cygheap.o cygthread.o dcrt0.o \
debug.o delqueue.o dir.o dlfcn.o dll_init.o dtable.o environ.o \
errno.o exceptions.o exec.o external.o fcntl.o fhandler.o \
fhandler_clipboard.o fhandler_console.o fhandler_disk_file.o \
@@ -155,15 +155,15 @@ DLL_OFILES:=assert.o autoload.o cxx.o bsdlib.o cygheap.o cygthread.o dcrt0.o \
fhandler_raw.o fhandler_registry.o fhandler_serial.o \
fhandler_socket.o fhandler_tape.o fhandler_termios.o \
fhandler_tty.o fhandler_virtual.o fhandler_windows.o \
- fhandler_zero.o fnmatch.o fork.o glob.o grp.o heap.o init.o ioctl.o \
- ipc.o localtime.o malloc_wrapper.o miscfuncs.o mmap.o msg.o \
- net.o netdb.o ntea.o passwd.o path.o pinfo.o pipe.o poll.o pthread.o \
- regcomp.o regerror.o regexec.o regfree.o registry.o resource.o \
- scandir.o sched.o sec_acl.o sec_helper.o security.o select.o sem.o \
- shared.o shm.o signal.o sigproc.o smallprint.o spawn.o strace.o \
- strsep.o sync.o syscalls.o sysconf.o syslog.o termios.o thread.o \
- times.o tty.o uinfo.o uname.o v8_regexp.o v8_regerror.o v8_regsub.o \
- wait.o wincap.o window.o \
+ fhandler_zero.o fnmatch.o fork.o getopt.o glob.o grp.o heap.o init.o \
+ ioctl.o ipc.o iruserok.o localtime.o malloc_wrapper.o miscfuncs.o \
+ mmap.o msg.o net.o netdb.o ntea.o passwd.o path.o pinfo.o pipe.o \
+ poll.o pthread.o regcomp.o regerror.o regexec.o regfree.o registry.o \
+ resource.o scandir.o sched.o sec_acl.o sec_helper.o security.o \
+ select.o sem.o shared.o shm.o signal.o sigproc.o smallprint.o spawn.o \
+ strace.o strsep.o sync.o syscalls.o sysconf.o syslog.o termios.o \
+ thread.o times.o tty.o uinfo.o uname.o v8_regexp.o v8_regerror.o \
+ v8_regsub.o wait.o wincap.o window.o \
$(EXTRA_DLL_OFILES) $(EXTRA_OFILES) $(MALLOC_OFILES) $(MT_SAFE_OBJECTS)
GMON_OFILES:=gmon.o mcount.o profil.o
diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din
index 9df575b..1f3575d 100644
--- a/winsup/cygwin/cygwin.din
+++ b/winsup/cygwin/cygwin.din
@@ -3,10 +3,12 @@ LIBRARY "cygwin1.dll" BASE=0x61000000
EXPORTS
__argc DATA
__argv DATA
+__check_rhosts_file DATA
__cygwin_environ DATA
__cygwin_user_data DATA
__mb_cur_max DATA
__progname DATA
+__rcmd_errstr DATA
_check_for_executable DATA
_ctype_ DATA
_daylight DATA
@@ -17,6 +19,11 @@ sys_nerr = _sys_nerr DATA
_timezone DATA
_tzname DATA
h_errno DATA
+optarg DATA
+opterr DATA
+optind DATA
+optopt DATA
+optreset DATA
reent_data DATA
@ALLOCA@
@DEF_DLL_ENTRY@
@@ -617,6 +624,8 @@ getmntent
_getmntent = getmntent
getmode
_getmode = getmode
+getopt
+getopt_long
getpagesize
_getpagesize = getpagesize
getpass
@@ -704,6 +713,8 @@ ioctl
_ioctl = ioctl
iprintf
_iprintf = iprintf
+iruserok
+ruserok
isalnum
_isalnum = isalnum
isalpha
diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h
index c37f529..1c92343 100644
--- a/winsup/cygwin/include/cygwin/version.h
+++ b/winsup/cygwin/include/cygwin/version.h
@@ -217,13 +217,15 @@ details. */
92: Export getusershell, setusershell, endusershell
93: Export daemon, forkpty, openpty, iruserok, ruserok, login_tty,
openpty, forkpty, revoke, logwtmp, updwtmp
+ 94: Export getopt, getopt_long, optarg, opterr, optind, optopt,
+ optreset, __check_rhosts_file, __rcmd_errstr.
*/
/* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
#define CYGWIN_VERSION_API_MAJOR 0
-#define CYGWIN_VERSION_API_MINOR 93
+#define CYGWIN_VERSION_API_MINOR 94
/* There is also a compatibity version number associated with the
shared memory regions. It is incremented when incompatible
diff --git a/winsup/cygwin/include/getopt.h b/winsup/cygwin/include/getopt.h
index 6b6f643..ba095ba 100644
--- a/winsup/cygwin/include/getopt.h
+++ b/winsup/cygwin/include/getopt.h
@@ -38,11 +38,13 @@
extern "C" {
#endif
-extern int opterr; /* if error message should be printed */
-extern int optind; /* index into parent argv vector */
-extern int optopt; /* character checked for validity */
-extern int optreset; /* reset getopt */
-extern char *optarg; /* argument associated with option */
+#ifndef __INSIDE_CYGWIN__
+extern int __declspec(dllimport) opterr; /* if error message should be printed */
+extern int __declspec(dllimport) optind; /* index into parent argv vector */
+extern int __declspec(dllimport) optopt; /* character checked for validity */
+extern int __declspec(dllimport) optreset; /* reset getopt */
+extern char __declspec(dllimport) *optarg; /* argument associated with option */
+#endif
int getopt (int, char * const *, const char *);
diff --git a/winsup/cygwin/lib/getopt.c b/winsup/cygwin/libc/getopt.c
index b5d5a23..5d97945 100644
--- a/winsup/cygwin/lib/getopt.c
+++ b/winsup/cygwin/libc/getopt.c
@@ -36,6 +36,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include "winsup.h"
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
@@ -52,11 +53,11 @@
#ifdef __weak_alias
__weak_alias(getopt,_getopt)
#endif
-int opterr = 1; /* if error message should be printed */
-int optind = 1; /* index into parent argv vector */
-int optopt = '?'; /* character checked for validity */
-int optreset; /* reset getopt */
-char *optarg; /* argument associated with option */
+int __declspec(dllexport) opterr; /* if error message should be printed */
+int __declspec(dllexport) optind; /* index into parent argv vector */
+int __declspec(dllexport) optopt; /* character checked for validity */
+int __declspec(dllexport) optreset; /* reset getopt */
+char __declspec(dllexport) *optarg; /* argument associated with option */
#endif
#ifdef __weak_alias
@@ -66,7 +67,7 @@ __weak_alias(getopt_long,_getopt_long)
#ifndef __CYGWIN__
#define __progname __argv[0]
#else
-extern char __declspec(dllimport) *__progname;
+extern char *__progname;
#endif
#define IGNORE_FIRST (*options == '-' || *options == '+')
diff --git a/winsup/cygwin/lib/iruserok.c b/winsup/cygwin/libc/iruserok.c
index 5e95718..8326dd0 100644
--- a/winsup/cygwin/lib/iruserok.c
+++ b/winsup/cygwin/libc/iruserok.c
@@ -36,174 +36,52 @@
* SUCH DAMAGE.
*/
-#ifdef __CYGWIN__
-#define HAVE_MALLOC_H
-#define HAVE_STDLIB_H
-#define HAVE_STRING_H
-#define TIME_WITH_SYS_TIME
-#define PATH_HEQUIV "/etc/hosts.equiv"
-
-static int __ivaliduser();
-static int __icheckhost();
-
-struct hostent *cygwin_gethostbyname (const char *name);
-unsigned long cygwin_inet_addr (const char *cp);
-
-#define gethostbyname cygwin_gethostbyname
-#define inet_addr cygwin_inet_addr
-#endif
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
+#include "winsup.h"
#include <pwd.h>
-#include <sys/file.h>
-#include <sys/signal.h>
#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/uio.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#ifdef HAVE_MALLOC_H
#include <malloc.h>
-#endif
-#if defined(STDC_HEADERS) || defined(HAVE_STDLIB_H)
-#include <stdlib.h>
-#endif
-#ifdef HAVE_STRING_H
-# include <string.h>
-#endif
-#include <netinet/in.h>
-#ifdef HAVE_ARPA_NAMESER_H
-# include <arpa/nameser.h>
-#endif
+#include <string.h>
#include <netdb.h>
-#include <unistd.h>
#include <ctype.h>
#include <stdio.h>
#include <errno.h>
-#ifdef TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# ifdef HAVE_SYS_TIME_H
-# include <sys/time.h>
-# else
-# include <time.h>
-# endif
-#endif
-#ifndef __CYGWIN__
-#include <resolv.h>
+#include <sys/time.h>
+#include <time.h>
+
+#ifndef PATH_HEQUIV
+# define PATH_HEQUIV "/etc/hosts.equiv"
#endif
-int __check_rhosts_file = 1;
+int __check_rhosts_file = 1;
const char *__rcmd_errstr;
-int
-ruserok(rhost, superuser, ruser, luser)
- const char *rhost;
- int superuser;
- const char *ruser;
- const char *luser;
-{
- struct hostent *hp;
- u_long addr;
- char **ap;
-
- if ((hp = gethostbyname(rhost)) == NULL)
- return (-1);
- for (ap = hp->h_addr_list; *ap; ++ap) {
- bcopy(*ap, &addr, sizeof(addr));
- if (iruserok(addr, superuser, ruser, luser) == 0)
- return (0);
- }
- return (-1);
-}
-
/*
- * New .rhosts strategy: We are passed an ip address. We spin through
- * hosts.equiv and .rhosts looking for a match. When the .rhosts only
- * has ip addresses, we don't have to trust a nameserver. When it
- * contains hostnames, we spin through the list of addresses the nameserver
- * gives us and look for a match.
- *
- * Returns 0 if ok, -1 if not ok.
+ * Returns "true" if match, 0 if no match.
*/
-int
-iruserok(raddr, superuser, ruser, luser)
+static int
+__icheckhost(raddr, lhost)
u_long raddr;
- int superuser;
- const char *ruser;
- const char *luser;
+ register char *lhost;
{
- register const char *cp;
- struct stat sbuf;
- struct passwd *pwd;
- FILE *hostf;
- uid_t uid;
- int first = 1;
- char *pbuf;
+ register struct hostent *hp;
+ register u_long laddr;
+ register char **pp;
- first = 1;
- hostf = superuser ? NULL : fopen(PATH_HEQUIV, "r");
-again:
- if (hostf) {
- if (__ivaliduser(hostf, raddr, luser, ruser) == 0) {
- (void) fclose(hostf);
- return(0);
- }
- (void) fclose(hostf);
- }
- if (first == 1 && (__check_rhosts_file || superuser)) {
- first = 0;
- if ((pwd = getpwnam(luser)) == NULL)
- return(-1);
+ /* Try for raw ip address first. */
+ if (isdigit(*lhost) && (long)(laddr = cygwin_inet_addr(lhost)) != -1)
+ return (raddr == laddr);
- pbuf = malloc (strlen (pwd->pw_dir) + sizeof "/.rhosts");
- if (! pbuf)
- {
- errno = ENOMEM;
- return -1;
- }
- strcpy (pbuf, pwd->pw_dir);
- strcat (pbuf, "/.rhosts");
+ /* Better be a hostname. */
+ if ((hp = cygwin_gethostbyname(lhost)) == NULL)
+ return (0);
- /*
- * Change effective uid while opening .rhosts. If root and
- * reading an NFS mounted file system, can't read files that
- * are protected read/write owner only.
- */
- uid = geteuid();
- (void)seteuid(pwd->pw_uid);
- hostf = fopen(pbuf, "r");
- (void)seteuid(uid);
+ /* Spin through ip addresses. */
+ for (pp = hp->h_addr_list; *pp; ++pp)
+ if (!bcmp(&raddr, *pp, sizeof(u_long)))
+ return (1);
- if (hostf == NULL)
- return(-1);
- /*
- * If not a regular file, or is owned by someone other than
- * user or root or if writeable by anyone but the owner, quit.
- */
- cp = NULL;
- if (lstat(pbuf, &sbuf) < 0)
- cp = ".rhosts not regular file";
- else if (!S_ISREG(sbuf.st_mode))
- cp = ".rhosts not regular file";
- else if (fstat(fileno(hostf), &sbuf) < 0)
- cp = ".rhosts fstat failed";
- else if (sbuf.st_uid && sbuf.st_uid != pwd->pw_uid)
- cp = "bad .rhosts owner";
- else if (sbuf.st_mode & (S_IWGRP|S_IWOTH))
- cp = ".rhosts writeable by other than owner";
- /* If there were any problems, quit. */
- if (cp) {
- __rcmd_errstr = (char *) cp;
- fclose(hostf);
- return(-1);
- }
- goto again;
- }
- return (-1);
+ /* No match. */
+ return (0);
}
/*
@@ -212,12 +90,9 @@ again:
*
* Returns 0 if ok, -1 if not ok.
*/
-#ifdef __CYGWIN__
-static
-#endif
-int
+static int
__ivaliduser(hostf, raddr, luser, ruser)
- FILE *hostf;
+ struct __sFILE64 *hostf;
u_long raddr;
const char *luser;
const char *ruser;
@@ -287,33 +162,109 @@ __ivaliduser(hostf, raddr, luser, ruser)
}
/*
- * Returns "true" if match, 0 if no match.
+ * New .rhosts strategy: We are passed an ip address. We spin through
+ * hosts.equiv and .rhosts looking for a match. When the .rhosts only
+ * has ip addresses, we don't have to trust a nameserver. When it
+ * contains hostnames, we spin through the list of addresses the nameserver
+ * gives us and look for a match.
+ *
+ * Returns 0 if ok, -1 if not ok.
*/
-#ifdef __CYGWIN__
-static
-#endif
int
-__icheckhost(raddr, lhost)
+iruserok(raddr, superuser, ruser, luser)
u_long raddr;
- register char *lhost;
+ int superuser;
+ const char *ruser;
+ const char *luser;
{
- register struct hostent *hp;
- register u_long laddr;
- register char **pp;
+ register const char *cp;
+ struct __stat64 sbuf;
+ struct passwd *pwd;
+ struct __sFILE64 *hostf;
- /* Try for raw ip address first. */
- if (isdigit(*lhost) && (long)(laddr = inet_addr(lhost)) != -1)
- return (raddr == laddr);
+ uid_t uid;
+ int first = 1;
+ char *pbuf;
- /* Better be a hostname. */
- if ((hp = gethostbyname(lhost)) == NULL)
- return (0);
+ first = 1;
+ hostf = superuser ? NULL : fopen64(PATH_HEQUIV, "rt");
+again:
+ if (hostf) {
+ if (__ivaliduser(hostf, raddr, luser, ruser) == 0) {
+ (void) fclose(hostf);
+ return(0);
+ }
+ (void) fclose(hostf);
+ }
+ if (first == 1 && (__check_rhosts_file || superuser)) {
+ first = 0;
+ if ((pwd = getpwnam(luser)) == NULL)
+ return(-1);
- /* Spin through ip addresses. */
- for (pp = hp->h_addr_list; *pp; ++pp)
- if (!bcmp(&raddr, *pp, sizeof(u_long)))
- return (1);
+ pbuf = malloc (strlen (pwd->pw_dir) + sizeof "/.rhosts");
+ if (! pbuf)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ strcpy (pbuf, pwd->pw_dir);
+ strcat (pbuf, "/.rhosts");
- /* No match. */
- return (0);
+ /*
+ * Change effective uid while opening .rhosts. If root and
+ * reading an NFS mounted file system, can't read files that
+ * are protected read/write owner only.
+ */
+ uid = geteuid32();
+ (void)seteuid32(pwd->pw_uid);
+ hostf = fopen64(pbuf, "rt");
+ (void)seteuid32(uid);
+
+ if (hostf == NULL)
+ return(-1);
+ /*
+ * If not a regular file, or is owned by someone other than
+ * user or root or if writeable by anyone but the owner, quit.
+ */
+ cp = NULL;
+ if (lstat64(pbuf, &sbuf) < 0)
+ cp = ".rhosts not regular file";
+ else if (!S_ISREG(sbuf.st_mode))
+ cp = ".rhosts not regular file";
+ else if (fstat64(fileno(hostf), &sbuf) < 0)
+ cp = ".rhosts fstat failed";
+ else if (sbuf.st_uid && sbuf.st_uid != pwd->pw_uid)
+ cp = "bad .rhosts owner";
+ else if (sbuf.st_mode & (S_IWGRP|S_IWOTH))
+ cp = ".rhosts writeable by other than owner";
+ /* If there were any problems, quit. */
+ if (cp) {
+ __rcmd_errstr = (char *) cp;
+ fclose(hostf);
+ return(-1);
+ }
+ goto again;
+ }
+ return (-1);
+}
+
+int
+ruserok(rhost, superuser, ruser, luser)
+ const char *rhost;
+ int superuser;
+ const char *ruser;
+ const char *luser;
+{
+ struct hostent *hp;
+ u_long addr;
+ char **ap;
+
+ if ((hp = cygwin_gethostbyname(rhost)) == NULL)
+ return (-1);
+ for (ap = hp->h_addr_list; *ap; ++ap) {
+ bcopy(*ap, &addr, sizeof(addr));
+ if (iruserok(addr, superuser, ruser, luser) == 0)
+ return (0);
+ }
+ return (-1);
}
diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc
index 0880c3f..a6a2b1b 100644
--- a/winsup/cygwin/syscalls.cc
+++ b/winsup/cygwin/syscalls.cc
@@ -2919,7 +2919,7 @@ long gethostid(void)
#define ETC_SHELLS "/etc/shells"
static int shell_index;
-static FILE *shell_fp;
+static struct __sFILE64 *shell_fp;
extern "C" char *
getusershell ()
@@ -2938,7 +2938,7 @@ getusershell ()
static char buf[MAX_PATH];
int ch, buf_idx;
- if (!shell_fp && !(shell_fp = fopen (ETC_SHELLS, "rt")))
+ if (!shell_fp && !(shell_fp = fopen64 (ETC_SHELLS, "rt")))
{
if (def_shells[shell_index])
return strcpy (buf, def_shells[shell_index++]);
diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h
index 68a386c..83db260 100644
--- a/winsup/cygwin/winsup.h
+++ b/winsup/cygwin/winsup.h
@@ -37,14 +37,20 @@ details. */
#include <sys/types.h>
#include <sys/strace.h>
+/* Declarations for functions used in C and C++ code. */
#ifdef __cplusplus
extern "C" {
#endif
extern __uid32_t getuid32 (void);
extern __uid32_t geteuid32 (void);
+extern int seteuid32 (__uid32_t);
extern __gid32_t getegid32 (void);
extern struct passwd *getpwuid32 (__uid32_t);
-struct passwd *getpwnam (const char *);
+extern struct passwd *getpwnam (const char *);
+extern struct __sFILE64 *fopen64 (const char *, const char *);
+extern struct hostent *cygwin_gethostbyname (const char *name);
+extern unsigned long cygwin_inet_addr (const char *cp);
+
#ifdef __cplusplus
}
#endif