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 \
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
* 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);
}
/*
*
* 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;
}
/*
- * 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);
}