2071 lines
57 KiB
Diff
2071 lines
57 KiB
Diff
--- origsrc/inetutils-2.6/Makefile.in 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/Makefile.in 2025-03-12 15:41:59.393352400 +0900
|
||
@@ -2130,6 +2130,7 @@ top_builddir = @top_builddir@
|
||
top_srcdir = @top_srcdir@
|
||
traceroute_BUILD = @traceroute_BUILD@
|
||
traceroute_INSTALL_HOOK = @traceroute_INSTALL_HOOK@
|
||
+traceroute_EXTRALIBS = @traceroute_EXTRALIBS@
|
||
traceroute_PROPS = @traceroute_PROPS@
|
||
uucpd_BUILD = @uucpd_BUILD@
|
||
uucpd_INSTALL_HOOK = @uucpd_INSTALL_HOOK@
|
||
--- origsrc/inetutils-2.6/configure 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/configure 2025-03-12 15:41:59.413351700 +0900
|
||
@@ -2542,6 +2542,7 @@ enable_traceroute
|
||
traceroute_PROPS
|
||
traceroute_INSTALL_HOOK
|
||
traceroute_BUILD
|
||
+traceroute_EXTRALIBS
|
||
ENABLE_ifconfig_FALSE
|
||
ENABLE_ifconfig_TRUE
|
||
enable_ifconfig
|
||
@@ -6804,6 +6805,11 @@ fi
|
||
if test "$enable_traceroute" = yes; then
|
||
traceroute_BUILD=traceroute$EXEEXT
|
||
traceroute_INSTALL_HOOK="install-traceroute-hook"
|
||
+ case "$host_os" in
|
||
+ cygwin*)
|
||
+ traceroute_EXTRALIBS="-liphlpapi"
|
||
+ ;;
|
||
+ esac
|
||
else
|
||
traceroute_BUILD=''
|
||
traceroute_INSTALL_HOOK=''
|
||
--- origsrc/inetutils-2.6/ftp/cmds.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/ftp/cmds.c 2025-03-12 15:41:59.433356800 +0900
|
||
@@ -100,6 +100,10 @@
|
||
# endif
|
||
#endif /* !DEFPORT */
|
||
|
||
+#ifdef __CYGWIN__
|
||
+typedef _sig_func_ptr sig_t;
|
||
+#endif
|
||
+
|
||
/* Returns true if STR is entirely lower case. */
|
||
static int
|
||
all_lower (char *str)
|
||
@@ -309,6 +313,13 @@ setpeer (int argc, char **argv)
|
||
if (autologin)
|
||
login (host);
|
||
|
||
+#ifdef __CYGWIN__
|
||
+# ifndef unix
|
||
+# define unix
|
||
+# endif
|
||
+# define NBBY 8
|
||
+#endif /* __CYGWIN__ */
|
||
+
|
||
#if (defined unix || defined __unix || defined __unix__) && NBBY == 8
|
||
/*
|
||
* this ifdef is to keep someone form "porting" this to an incompatible
|
||
@@ -1914,7 +1925,7 @@ quote1 (char *initial, int argc, char **
|
||
len += strlen (strcpy (&buf[len], argv[i]));
|
||
}
|
||
}
|
||
- if (command (buf) == PRELIM)
|
||
+ if (command ("%s", buf) == PRELIM)
|
||
{
|
||
while (getreply (0) == PRELIM)
|
||
continue;
|
||
--- origsrc/inetutils-2.6/ftp/ftp.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/ftp/ftp.c 2025-03-12 16:35:36.882213600 +0900
|
||
@@ -94,6 +94,10 @@
|
||
#include "ftp_var.h"
|
||
#include "attribute.h"
|
||
|
||
+#ifdef __CYGWIN__
|
||
+#include <io.h>
|
||
+#endif
|
||
+
|
||
int data = -1;
|
||
int abrtflag = 0;
|
||
jmp_buf ptabort;
|
||
@@ -666,7 +670,15 @@ sendrequest (char *cmd, char *local, cha
|
||
}
|
||
else
|
||
{
|
||
+#ifdef __CYGWIN__
|
||
+ if (curtype != TYPE_A) {
|
||
+ fin = fopen (local, "rb");
|
||
+ } else {
|
||
+ fin = fopen (local, "r");
|
||
+ }
|
||
+#else
|
||
fin = fopen (local, "r");
|
||
+#endif
|
||
if (fin == NULL)
|
||
{
|
||
error (0, errno, "local: %s", local);
|
||
@@ -710,6 +722,7 @@ sendrequest (char *cmd, char *local, cha
|
||
break;
|
||
case TYPE_I:
|
||
case TYPE_L:
|
||
+ setmode (fileno (fin), O_BINARY);
|
||
rc = lseek (fileno (fin), restart_point, SEEK_SET);
|
||
break;
|
||
}
|
||
@@ -778,6 +791,8 @@ sendrequest (char *cmd, char *local, cha
|
||
|
||
case TYPE_I:
|
||
case TYPE_L:
|
||
+ setmode (fileno (fin), O_BINARY);
|
||
+ setmode (fileno (dout), O_BINARY);
|
||
errno = d = 0;
|
||
while ((c = read (fileno (fin), buf, bufsize)) > 0)
|
||
{
|
||
@@ -1013,7 +1028,17 @@ recvrequest (char *cmd, char *local, cha
|
||
{
|
||
struct stat st;
|
||
|
||
+#ifdef __CYGWIN__
|
||
+ {
|
||
+ char nmode[8];
|
||
+ strcpy (nmode, lmode);
|
||
+ if (curtype != TYPE_A)
|
||
+ strcat (nmode, "b");
|
||
+ fout = fopen (local, nmode);
|
||
+ }
|
||
+#else
|
||
fout = fopen (local, lmode);
|
||
+#endif
|
||
if (fout == NULL || fstat (fileno (fout), &st) < 0)
|
||
{
|
||
error (0, errno, "local: %s", local);
|
||
@@ -1042,6 +1067,8 @@ recvrequest (char *cmd, char *local, cha
|
||
|
||
case TYPE_I:
|
||
case TYPE_L:
|
||
+ setmode (fileno (fout), O_BINARY);
|
||
+ setmode (fileno (din), O_BINARY);
|
||
if (restart_point && lseek (fileno (fout), restart_point, SEEK_SET) < 0)
|
||
{
|
||
error (0, errno, "local: %s", local);
|
||
@@ -1520,10 +1547,15 @@ noport:
|
||
result = ERROR; /* For success detection. */
|
||
if (data_addr.ss_family != AF_INET || doepsv4)
|
||
{
|
||
+ char *p;
|
||
/* Use EPRT mode. */
|
||
getnameinfo ((struct sockaddr *) &data_addr, ctladdrlen,
|
||
ia, sizeof (ia), portstr, sizeof (portstr),
|
||
NI_NUMERICHOST | NI_NUMERICSERV);
|
||
+ /* Remove IPv6 link local address postfix */
|
||
+ p = strchr (ia, '%');
|
||
+ if (p)
|
||
+ *p = '\0';
|
||
result = command ("EPRT |%d|%s|%s|",
|
||
(data_addr.ss_family == AF_INET) ? 1 : 2,
|
||
ia, portstr);
|
||
--- origsrc/inetutils-2.6/ftpd/auth.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/ftpd/auth.c 2025-03-12 15:41:59.453353200 +0900
|
||
@@ -18,6 +18,17 @@
|
||
|
||
#include <config.h>
|
||
|
||
+#ifdef __CYGWIN__
|
||
+# undef ERROR
|
||
+# include <windows.h>
|
||
+# include <pwd.h>
|
||
+# include <sys/cygwin.h>
|
||
+# include <io.h>
|
||
+# define is_winnt (GetVersion() < 0x80000000)
|
||
+#else
|
||
+# define is_winnt (0)
|
||
+#endif
|
||
+
|
||
#include <sys/types.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
@@ -43,6 +54,9 @@
|
||
shell as returned by getusershell(). Disallow anyone mentioned in the file
|
||
PATH_FTPUSERS to allow people such as root and uucp to be avoided. */
|
||
|
||
+static int
|
||
+do_cygwin_auth (const char* passwd, struct credentials *pcred);
|
||
+
|
||
int
|
||
auth_user (const char *name, struct credentials *pcred)
|
||
{
|
||
@@ -92,8 +106,8 @@ auth_user (const char *name, struct cred
|
||
*/
|
||
if (strcmp (name, "ftp") == 0 || strcmp (name, "anonymous") == 0)
|
||
{
|
||
- if (checkuser (PATH_FTPUSERS, "ftp")
|
||
- || checkuser (PATH_FTPUSERS, "anonymous"))
|
||
+ if (checkuser (PATH_FTPUSERS, "ftp", NULL)
|
||
+ || checkuser (PATH_FTPUSERS, "anonymous", NULL))
|
||
{
|
||
snprintf (pcred->message, len, "User %s access denied.",
|
||
name);
|
||
@@ -110,6 +124,8 @@ auth_user (const char *name, struct cred
|
||
snprintf (pcred->message, len, "User %s unknown.", name);
|
||
err = 1;
|
||
}
|
||
+ if (err == 0)
|
||
+ checkuser (PATH_FTPCHROOT, pcred->name, &pcred->rootdir);
|
||
return err;
|
||
}
|
||
|
||
@@ -128,7 +144,7 @@ auth_user (const char *name, struct cred
|
||
break;
|
||
endusershell ();
|
||
|
||
- if (cp == NULL || checkuser (PATH_FTPUSERS, name))
|
||
+ if (cp == NULL || checkuser (PATH_FTPUSERS, name, NULL))
|
||
{
|
||
sprintf (pcred->message, "User %s access denied.", name);
|
||
return 1;
|
||
@@ -148,7 +164,8 @@ auth_user (const char *name, struct cred
|
||
|
||
if (err == 0)
|
||
{
|
||
- pcred->dochroot = checkuser (PATH_FTPCHROOT, pcred->name);
|
||
+ pcred->dochroot =
|
||
+ checkuser (PATH_FTPCHROOT, pcred->name, &pcred->rootdir);
|
||
|
||
#if defined WITH_PAM && !defined WITH_LINUX_PAM
|
||
if (pcred->auth_type == AUTH_TYPE_PAM)
|
||
@@ -183,18 +200,49 @@ auth_pass (const char *passwd, struct cr
|
||
case AUTH_TYPE_PASSWD:
|
||
default:
|
||
{
|
||
+#ifdef __CYGWIN__
|
||
+ if (!is_winnt)
|
||
+ {
|
||
+#endif /* __CYGWIN__ */
|
||
char *xpasswd;
|
||
char *salt = pcred->passwd;
|
||
/* Try to authenticate the user. */
|
||
if (pcred->passwd == NULL || *pcred->passwd == '\0')
|
||
return 1; /* Failed. */
|
||
- xpasswd = crypt (passwd, salt);
|
||
+ xpasswd = (char*) crypt (passwd, salt);
|
||
return (!xpasswd || strcmp (xpasswd, pcred->passwd) != 0);
|
||
+#ifdef __CYGWIN__
|
||
+ } else {
|
||
+ return do_cygwin_auth (passwd, pcred);
|
||
+ }
|
||
+#endif /* __CYGWIN__ */
|
||
}
|
||
} /* switch (auth_type) */
|
||
return -1;
|
||
}
|
||
|
||
+#ifdef __CYGWIN__
|
||
+static int
|
||
+do_cygwin_auth (const char* passwd, struct credentials *pcred)
|
||
+{
|
||
+ struct passwd *p;
|
||
+ if ((pcred == NULL) || (pcred->name == NULL) || (pcred->name[0] == '\0'))
|
||
+ return 1;
|
||
+
|
||
+ /* can't "recreate" p from contents of pcred, because
|
||
+ struct passwd might contain extension elements
|
||
+ unknown to us
|
||
+ */
|
||
+ p = getpwnam (pcred->name);
|
||
+ if (p == NULL)
|
||
+ return 1;
|
||
+
|
||
+ HANDLE hToken = (HANDLE) cygwin_logon_user (p, passwd);
|
||
+ cygwin_set_impersonation_token (hToken);
|
||
+ return (hToken == INVALID_HANDLE_VALUE); // non-zero on error
|
||
+}
|
||
+#endif /* __CYGWIN__ */
|
||
+
|
||
int
|
||
sgetcred (const char *name, struct credentials *pcred)
|
||
{
|
||
--- origsrc/inetutils-2.6/ftpd/conf.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/ftpd/conf.c 2025-03-12 15:41:59.463355100 +0900
|
||
@@ -58,11 +58,11 @@ display_file (const char *name, int code
|
||
* Return 1 if yes, 0 otherwise.
|
||
*/
|
||
int
|
||
-checkuser (const char *filename, const char *name)
|
||
+checkuser (const char *filename, const char *name, char **path)
|
||
{
|
||
FILE *fp;
|
||
int found = 0, ngroups = 0;
|
||
- char *p, line[BUFSIZ];
|
||
+ char *p = NULL, line[BUFSIZ];
|
||
gid_t *groups = NULL;
|
||
struct passwd *pwd = NULL;
|
||
|
||
@@ -88,6 +88,7 @@ checkuser (const char *filename, const c
|
||
/* Wildcard entry, a single '@'. */
|
||
if (p[0] == '@' && (p[1] == 0 || isblank (p[1])))
|
||
{
|
||
+ p++;
|
||
found = 1;
|
||
break;
|
||
}
|
||
@@ -116,7 +117,8 @@ checkuser (const char *filename, const c
|
||
while (*p && (isalnum (*p) || *p == '_' || *p == '-'))
|
||
p++;
|
||
|
||
- *p = '\0'; /* Group name ends here. */
|
||
+ if (*p)
|
||
+ *p++ = '\0'; /* Group name ends here. */
|
||
|
||
grp = getgrnam (gname);
|
||
if (grp)
|
||
@@ -135,13 +137,46 @@ checkuser (const char *filename, const c
|
||
}
|
||
|
||
/* User name ends at the first blank character. */
|
||
- if (strncmp (p, name, strlen (name)) == 0
|
||
+ if (strncasecmp (p, name, strlen (name)) == 0
|
||
&& (p[strlen (name)] == 0 || isblank (p[strlen (name)])))
|
||
{
|
||
+ p += strlen (name);
|
||
found = 1;
|
||
break;
|
||
}
|
||
}
|
||
+
|
||
+ /* Extract the second field and set to *path */
|
||
+ if (found && path && p)
|
||
+ {
|
||
+ char *pend;
|
||
+ while (*p && isblank (*p))
|
||
+ p++;
|
||
+ pend = p;
|
||
+ while (*pend && !isblank (*pend))
|
||
+ pend++;
|
||
+ *pend = '\0';
|
||
+ if (*p)
|
||
+ {
|
||
+ char *buf = malloc (strlen (*path) + strlen (p) + 2);
|
||
+ if (buf)
|
||
+ {
|
||
+ if (*p != '/')
|
||
+ sprintf(buf, "%s/%s", *path, p);
|
||
+ else
|
||
+ sprintf(buf, "%s", p);
|
||
+ free (*path);
|
||
+ *path = sgetsave (buf);
|
||
+ free(buf);
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ perror_reply (421, "Local resource failure: malloc");
|
||
+ dologout (1);
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+
|
||
free (groups);
|
||
fclose (fp);
|
||
}
|
||
--- origsrc/inetutils-2.6/ftpd/extern.h 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/ftpd/extern.h 2025-03-12 15:41:59.473357100 +0900
|
||
@@ -54,7 +54,7 @@
|
||
#include <netinet/in.h>
|
||
|
||
extern void cwd (const char *);
|
||
-extern int checkuser (const char *filename, const char *name);
|
||
+extern int checkuser (const char *filename, const char *name, char **path);
|
||
extern void delete (const char *);
|
||
extern int display_file (const char *name, int code);
|
||
extern void dologout (int);
|
||
--- origsrc/inetutils-2.6/ftpd/ftpcmd.y 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/ftpd/ftpcmd.y 2025-03-12 15:41:59.483351500 +0900
|
||
@@ -593,7 +593,7 @@ cmd
|
||
# endif /* BSD */
|
||
#endif /* !HAVE_UNAME */
|
||
|
||
-#if defined unix || defined __unix || defined __unix__
|
||
+#if defined unix || defined __unix || defined __unix__ || defined __CYGWIN__
|
||
sys_type = "UNIX";
|
||
#else
|
||
sys_type = "UNKNOWN";
|
||
--- origsrc/inetutils-2.6/ftpd/ftpd.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/ftpd/ftpd.c 2025-03-12 15:45:04.762992200 +0900
|
||
@@ -111,6 +111,10 @@
|
||
# define LOG_FTP LOG_DAEMON /* Use generic facility. */
|
||
#endif
|
||
|
||
+#ifndef LARGE_TRANSFER_BLOCKSIZE
|
||
+# define LARGE_TRANSFER_BLOCKSIZE 4096
|
||
+#endif
|
||
+
|
||
#ifndef MAP_FAILED
|
||
# define MAP_FAILED (void*)-1
|
||
#endif
|
||
@@ -441,11 +445,21 @@ static struct argp argp = {
|
||
NULL
|
||
};
|
||
|
||
+#if defined(WITH_WRAP) && defined(__CYGWIN__)
|
||
+extern int allow_severity; /* set value in main() */
|
||
+extern int deny_severity; /* set value in main() */
|
||
+#endif
|
||
+
|
||
int
|
||
main (int argc, char *argv[], char **envp)
|
||
{
|
||
int index;
|
||
|
||
+#if defined(WITH_WRAP) && defined(__CYGWIN__)
|
||
+ allow_severity = LOG_INFO;
|
||
+ deny_severity = LOG_NOTICE;
|
||
+#endif
|
||
+
|
||
set_program_name (argv[0]);
|
||
|
||
#ifdef HAVE_TZSET
|
||
@@ -556,7 +570,7 @@ main (int argc, char *argv[], char **env
|
||
}
|
||
#endif
|
||
|
||
-#ifdef F_SETOWN
|
||
+#if defined(F_SETOWN) && !defined(__CYGWIN__)
|
||
if (fcntl (STDIN_FILENO, F_SETOWN, getpid ()) == -1)
|
||
syslog (LOG_ERR, "fcntl F_SETOWN: %m");
|
||
#endif
|
||
@@ -680,19 +694,55 @@ complete_login (struct credentials *pcre
|
||
/* We MUST do a chdir () after the chroot. Otherwise
|
||
the old current directory will be accessible as "."
|
||
outside the new root! */
|
||
- if (chroot (pcred->rootdir) < 0 || chdir (pcred->homedir) < 0)
|
||
+ char *subdir = strstr(pcred->rootdir, "/./");
|
||
+ if (subdir)
|
||
+ *subdir++ = '\0';
|
||
+ if (chroot (pcred->rootdir) < 0)
|
||
{
|
||
reply (550, "Can't set guest privileges.");
|
||
goto bad;
|
||
}
|
||
+ if (seteuid ((uid_t)pcred->uid) < 0)
|
||
+ {
|
||
+ reply(550, "Can't set uid.");
|
||
+ goto bad;
|
||
+ }
|
||
+ if (chdir (pcred->homedir) < 0)
|
||
+ {
|
||
+ reply(550, "Can't access home directory.");
|
||
+ goto bad;
|
||
+ }
|
||
+ if (subdir && chdir (subdir) < 0)
|
||
+ {
|
||
+ reply(550, "Can't change directory to %s.", subdir);
|
||
+ goto bad;
|
||
+ }
|
||
}
|
||
else if (pcred->dochroot)
|
||
{
|
||
- if (chroot (pcred->rootdir) < 0 || chdir (pcred->homedir) < 0)
|
||
+ char *subdir = strstr(pcred->rootdir, "/./");
|
||
+ if (subdir)
|
||
+ *subdir++ = '\0';
|
||
+ if (chroot (pcred->rootdir) < 0)
|
||
{
|
||
reply (550, "Can't change root.");
|
||
goto bad;
|
||
}
|
||
+ if (seteuid ((uid_t)pcred->uid) < 0)
|
||
+ {
|
||
+ reply(550, "Can't set uid.");
|
||
+ goto bad;
|
||
+ }
|
||
+ if (chdir (pcred->homedir) < 0)
|
||
+ {
|
||
+ reply(550, "Can't access home directory.");
|
||
+ goto bad;
|
||
+ }
|
||
+ if (subdir && chdir (subdir) < 0)
|
||
+ {
|
||
+ reply(550, "Can't change directory to %s.", subdir);
|
||
+ goto bad;
|
||
+ }
|
||
}
|
||
|
||
if (seteuid ((uid_t) pcred->uid) < 0)
|
||
@@ -703,6 +753,11 @@ complete_login (struct credentials *pcre
|
||
|
||
if (!pcred->guest && !pcred->dochroot) /* Remaining case. */
|
||
{
|
||
+ if (seteuid ((uid_t)pcred->uid) < 0)
|
||
+ {
|
||
+ reply(550, "Can't set uid.");
|
||
+ goto bad;
|
||
+ }
|
||
if (chdir (pcred->rootdir) < 0)
|
||
{
|
||
if (chdir ("/") < 0)
|
||
@@ -858,7 +913,7 @@ end_login (struct credentials *pcred)
|
||
char *remotehost = pcred->remotehost;
|
||
int atype = pcred->auth_type;
|
||
|
||
- if (seteuid ((uid_t) 0) == -1)
|
||
+ if (seteuid (getuid ()) == -1)
|
||
_exit (EXIT_FAILURE);
|
||
|
||
if (pcred->logged_in)
|
||
@@ -970,6 +1025,11 @@ retrieve (const char *cmd, const char *n
|
||
|
||
if (cmd == 0)
|
||
{
|
||
+#ifdef __CYGWIN__
|
||
+ if (type != TYPE_A)
|
||
+ fin = fopen (name, "rb"), closefunc = fclose;
|
||
+ else
|
||
+#endif
|
||
fin = fopen (name, "r"), closefunc = fclose;
|
||
st.st_size = 0;
|
||
}
|
||
@@ -1057,6 +1117,13 @@ store (const char *name, const char *mod
|
||
FILE *fout, *din;
|
||
struct stat st;
|
||
int (*closefunc) (FILE *);
|
||
+ char nmode[8];
|
||
+
|
||
+ strcpy (nmode, mode);
|
||
+#ifdef __CYGWIN__
|
||
+ if (type != TYPE_A)
|
||
+ strcat (nmode, "b");
|
||
+#endif
|
||
|
||
if (unique && stat (name, &st) == 0)
|
||
{
|
||
@@ -1072,8 +1139,16 @@ store (const char *name, const char *mod
|
||
}
|
||
|
||
if (restart_point)
|
||
- mode = "r+";
|
||
- fout = fopen (name, mode);
|
||
+ {
|
||
+#ifdef __CYGWIN__
|
||
+ if (type != TYPE_A)
|
||
+ mode = "rb+";
|
||
+ else
|
||
+#endif
|
||
+ mode = "r+";
|
||
+ strcpy (nmode, mode);
|
||
+ }
|
||
+ fout = fopen (name, nmode);
|
||
closefunc = fclose;
|
||
if (fout == NULL || fstat (fileno (fout), &st) < 0)
|
||
{
|
||
@@ -1149,7 +1224,7 @@ getdatasock (const char *mode)
|
||
|
||
if (data >= 0)
|
||
return fdopen (data, mode);
|
||
- if (seteuid ((uid_t) 0) == -1)
|
||
+ if (seteuid (getuid ()) == -1)
|
||
_exit (EXIT_FAILURE);
|
||
s = socket (ctrl_addr.ss_family, SOCK_STREAM, 0);
|
||
if (s < 0)
|
||
@@ -1316,9 +1391,12 @@ static void
|
||
send_data (FILE *instr, FILE *outstr, off_t blksize)
|
||
{
|
||
int c, cnt, filefd, netfd;
|
||
- char *buf = MAP_FAILED, *bp;
|
||
+ char *buf = MAP_FAILED;
|
||
off_t curpos;
|
||
+#ifdef HAVE_MMAP
|
||
+ char *bp;
|
||
off_t len, filesize;
|
||
+#endif
|
||
|
||
transflag++;
|
||
if (setjmp (urgcatch))
|
||
@@ -1411,7 +1489,14 @@ send_data (FILE *instr, FILE *outstr, of
|
||
len = filesize;
|
||
do
|
||
{
|
||
+#ifdef __CYGWIN__
|
||
+ cnt = write (netfd, bp,
|
||
+ (len < LARGE_TRANSFER_BLOCKSIZE ?
|
||
+ len : LARGE_TRANSFER_BLOCKSIZE));
|
||
+#else
|
||
cnt = write (netfd, bp, len);
|
||
+#endif /* __CYGWIN__ */
|
||
+
|
||
len -= cnt;
|
||
bp += cnt;
|
||
if (cnt > 0)
|
||
@@ -1436,6 +1521,9 @@ send_data (FILE *instr, FILE *outstr, of
|
||
syslog (LOG_DEBUG, "Starting at position %jd.", curpos);
|
||
}
|
||
|
||
+ if (blksize <= 0)
|
||
+ blksize = LARGE_TRANSFER_BLOCKSIZE;
|
||
+
|
||
buf = malloc ((unsigned int) blksize);
|
||
if (buf == NULL)
|
||
{
|
||
@@ -1975,7 +2063,7 @@ passive (int epsv, int af)
|
||
else /* !AF_INET6 */
|
||
((struct sockaddr_in *) &pasv_addr)->sin_port = 0;
|
||
|
||
- if (seteuid ((uid_t) 0) == -1)
|
||
+ if (seteuid (getuid ()) == -1)
|
||
_exit (EXIT_FAILURE);
|
||
if (bind (pdata, (struct sockaddr *) &pasv_addr, pasv_addrlen) < 0)
|
||
{
|
||
--- origsrc/inetutils-2.6/ftpd/server_mode.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/ftpd/server_mode.c 2025-03-12 15:41:59.503353600 +0900
|
||
@@ -57,8 +57,14 @@ static void reapchild (int);
|
||
extern int hosts_ctl (char *, char *, char *, char *);
|
||
# endif
|
||
|
||
+#ifdef __CYGWIN__
|
||
+/* provided by library (e.g. extern, here) on cygwin */
|
||
+extern int allow_severity; /* set value in main() */
|
||
+extern int deny_severity; /* set value in main() */
|
||
+#else
|
||
int allow_severity = LOG_INFO;
|
||
int deny_severity = LOG_NOTICE;
|
||
+#endif
|
||
|
||
static int
|
||
check_host (struct sockaddr *sa, socklen_t len)
|
||
--- origsrc/inetutils-2.6/headers/protocols/talkd.h 2025-03-12 15:41:05.064209400 +0900
|
||
+++ src/inetutils-2.6/headers/protocols/talkd.h 2025-03-12 15:41:59.513351800 +0900
|
||
@@ -61,6 +61,12 @@
|
||
extern "C" {
|
||
#endif
|
||
|
||
+/* 4.3BSD sockaddr structure (used by talk protocol). */
|
||
+struct osockaddr {
|
||
+ u_short sa_family; /* address family */
|
||
+ char sa_data[14]; /* up to 14 bytes of direct address */
|
||
+};
|
||
+
|
||
/*
|
||
* Client->server request message format.
|
||
*/
|
||
--- origsrc/inetutils-2.6/ifconfig/ifconfig.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/ifconfig/ifconfig.c 2025-03-12 15:41:59.523355600 +0900
|
||
@@ -46,6 +46,11 @@
|
||
#include <progname.h>
|
||
#include "ifconfig.h"
|
||
|
||
+#ifdef __CYGWIN__
|
||
+#define if_nametoindex(x) cygwin_if_nametoindex(x)
|
||
+extern unsigned cygwin_if_nametoindex(const char *name);
|
||
+#endif
|
||
+
|
||
int
|
||
main (int argc, char *argv[])
|
||
{
|
||
--- origsrc/inetutils-2.6/ifconfig/options.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/ifconfig/options.c 2025-03-12 15:41:59.523355600 +0900
|
||
@@ -79,6 +79,9 @@ struct format formats[] = {
|
||
"${format}{check-existence}"
|
||
"${ifdisplay?}{"
|
||
"${name} (${index}):${\\n}"
|
||
+#ifdef __CYGWIN__
|
||
+ "${frndlyname?}{ frndlyname ${tab}{16}${frndlyname}${\\n}}"
|
||
+#endif
|
||
"${addr?}{ inet address ${tab}{16}${addr}${\\n}}"
|
||
"${netmask?}{ netmask ${tab}{16}${netmask}${\\n}}"
|
||
"${brdaddr?}{ broadcast ${tab}{16}${brdaddr}${\\n}}"
|
||
--- origsrc/inetutils-2.6/ifconfig/printif.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/ifconfig/printif.c 2025-03-12 15:41:59.533353400 +0900
|
||
@@ -48,6 +48,11 @@
|
||
#include "xalloc.h"
|
||
#include <attribute.h>
|
||
|
||
+#ifdef __CYGWIN__
|
||
+#define if_nametoindex(x) cygwin_if_nametoindex(x)
|
||
+extern unsigned cygwin_if_nametoindex(const char *name);
|
||
+#endif
|
||
+
|
||
FILE *ostream; /* Either stdout or stderror. */
|
||
int column_stdout; /* The column position of the cursor on stdout. */
|
||
int column_stderr; /* The column position of the cursor on stderr. */
|
||
@@ -112,6 +117,10 @@ struct format_handle format_handles[] =
|
||
{"dma?", fh_dma_query},
|
||
{"dma", fh_dma},
|
||
#endif /* HAVE_STRUCT_IFREQ_IFR_MAP */
|
||
+#ifdef __CYGWIN__
|
||
+ {"frndlyname?", fh_frndlyname_query},
|
||
+ {"frndlyname", fh_frndlyname},
|
||
+#endif
|
||
{NULL, NULL}
|
||
};
|
||
|
||
@@ -484,7 +493,11 @@ fh_ifdisplay_query (format_data_t form,
|
||
{
|
||
/* Otherwise, only interfaces in state `UP' are displayed. */
|
||
int rev = 0;
|
||
+#ifdef __CYGWIN__
|
||
+ int f = if_nameztoflag ("RUNNING", &rev);
|
||
+#else
|
||
int f = if_nameztoflag ("UP", &rev);
|
||
+#endif
|
||
|
||
n = f && ioctl (form->sfd, SIOCGIFFLAGS, form->ifr) == 0;
|
||
if (n)
|
||
@@ -1045,6 +1058,37 @@ fh_dma (format_data_t form, int argc, ch
|
||
|
||
#endif /* HAVE_STRUCT_IFREQ_IFR_MAP */
|
||
|
||
+#ifdef __CYGWIN__
|
||
+#include <cygwin/if.h>
|
||
+void
|
||
+fh_frndlyname_query (format_data_t form, int argc, char *argv[])
|
||
+{
|
||
+#ifdef SIOCGIFFRNDLYNAM
|
||
+ struct ifreq_frndlyname fname;
|
||
+ form->ifr->ifr_frndlyname = &fname;
|
||
+ if (ioctl (form->sfd, SIOCGIFFRNDLYNAM, form->ifr) >= 0)
|
||
+ select_arg (form, argc, argv, 0);
|
||
+ else
|
||
+#endif
|
||
+ select_arg (form, argc, argv, 1);
|
||
+}
|
||
+
|
||
+void
|
||
+fh_frndlyname (format_data_t form, int argc, char *argv[])
|
||
+{
|
||
+#ifdef SIOCGIFFRNDLYNAM
|
||
+ if (ioctl (form->sfd, SIOCGIFFRNDLYNAM, form->ifr) < 0)
|
||
+ error (EXIT_FAILURE, errno,
|
||
+ "SIOCGIFFRNDLYNAM failed for interface `%s'", form->ifr->ifr_name);
|
||
+ else
|
||
+ put_string (form, ((struct ifreq_frndlyname *)form->ifr->ifr_frndlyname)->ifrf_friendlyname);
|
||
+#else
|
||
+ *column += printf ("(not available)");
|
||
+ had_output = 1;
|
||
+#endif
|
||
+}
|
||
+#endif
|
||
+
|
||
void
|
||
print_interfaceX (format_data_t form, int quiet)
|
||
{
|
||
--- origsrc/inetutils-2.6/ifconfig/printif.h 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/ifconfig/printif.h 2025-03-12 15:41:59.543352500 +0900
|
||
@@ -124,6 +124,10 @@ void fh_media_query (format_data_t form,
|
||
void fh_media (format_data_t form, int argc, char *argv[]);
|
||
void fh_status_query (format_data_t form, int argc, char *argv[]);
|
||
void fh_status (format_data_t form, int argc, char *argv[]);
|
||
+#ifdef __CYGWIN__
|
||
+void fh_frndlyname_query (format_data_t form, int argc, char *argv[]);
|
||
+void fh_frndlyname (format_data_t form, int argc, char *argv[]);
|
||
+#endif
|
||
|
||
/* Used for recursion by format handlers. */
|
||
void print_interfaceX (format_data_t form, int quiet);
|
||
--- origsrc/inetutils-2.6/ifconfig/system/generic.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/ifconfig/system/generic.c 2025-03-12 15:41:59.554022000 +0900
|
||
@@ -64,4 +64,60 @@ system_configure (int sfd MAYBE_UNUSED,
|
||
return 0;
|
||
}
|
||
|
||
+#ifdef __CYGWIN__
|
||
+#include <unistd.h>
|
||
+#include <string.h>
|
||
+#include <stdlib.h>
|
||
+#define MAXIFS 256
|
||
+unsigned
|
||
+cygwin_if_nametoindex(const char *name)
|
||
+{
|
||
+ FILE *f;
|
||
+ static char if_name[MAXIFS][IFNAMSIZ];
|
||
+ static unsigned if_index[MAXIFS];
|
||
+ static int num_entry = 0;
|
||
+
|
||
+ if (num_entry == 0) {
|
||
+ f = fopen ("/proc/net/if_inet6", "r");
|
||
+ do {
|
||
+ if (2 != fscanf (f, "%*s%02x%*x%*x%*x%s\n", &if_index[num_entry], if_name[num_entry])) break;
|
||
+ if (num_entry < MAXIFS) num_entry++;
|
||
+ } while (1);
|
||
+ fclose (f);
|
||
+ }
|
||
+
|
||
+ for (int i = 0; i < num_entry; i++) {
|
||
+ if (!strcmp (if_name[i], name)) return if_index[i];
|
||
+ }
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+static struct if_nameindex *
|
||
+cygwin_if_nameindex (void)
|
||
+{
|
||
+ struct if_nameindex *idx;
|
||
+ struct if_nameindex *idx_tmp;
|
||
+ int num = 0;
|
||
+ idx = if_nameindex();
|
||
+ if (!idx) return NULL;
|
||
+ idx_tmp = malloc (MAXIFS * sizeof (*idx_tmp));
|
||
+ if (!idx_tmp) return NULL;
|
||
+ for (int i = 0; idx[i].if_name; i++) {
|
||
+ unsigned index = cygwin_if_nametoindex (idx[i].if_name);
|
||
+ if (index) {
|
||
+ idx_tmp[num].if_name = idx[i].if_name;
|
||
+ idx_tmp[num].if_index = index;
|
||
+ if (num < MAXIFS) num++;
|
||
+ }
|
||
+ }
|
||
+ idx_tmp[num].if_name = NULL;
|
||
+ idx_tmp[num].if_index = 0;
|
||
+ memcpy(idx, idx_tmp, (num + 1) * sizeof (*idx));
|
||
+ free(idx_tmp);
|
||
+ return idx;
|
||
+}
|
||
+
|
||
+struct if_nameindex *(*system_if_nameindex) (void) = cygwin_if_nameindex;
|
||
+#else
|
||
struct if_nameindex *(*system_if_nameindex) (void) = if_nameindex;
|
||
+#endif
|
||
--- origsrc/inetutils-2.6/lib/sys_select.in.h 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/lib/sys_select.in.h 2025-03-12 15:41:59.563354600 +0900
|
||
@@ -42,7 +42,7 @@
|
||
# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
|
||
|
||
#elif (@HAVE_SYS_SELECT_H@ \
|
||
- && (defined _CYGWIN_SYS_TIME_H \
|
||
+ && (defined __CYGWIN__ \
|
||
|| (!defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H \
|
||
&& ((defined __osf__ && defined _SYS_TIME_H_ \
|
||
&& defined _OSF_SOURCE) \
|
||
--- origsrc/inetutils-2.6/libinetutils/daemon.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/libinetutils/daemon.c 2025-03-12 15:41:59.573352100 +0900
|
||
@@ -49,11 +49,13 @@
|
||
#include <fcntl.h>
|
||
#include <unistd.h>
|
||
#include <signal.h>
|
||
+#include <syslog.h>
|
||
#include <error.h>
|
||
#include <stdlib.h>
|
||
#include <sys/types.h>
|
||
#include <sys/wait.h>
|
||
#include <attribute.h>
|
||
+#include <string.h>
|
||
|
||
/*
|
||
According to Unix-FAQ maintained by Andrew Gierth:
|
||
@@ -101,13 +103,87 @@
|
||
|
||
#define MAXFD 64
|
||
|
||
+/* copy signal stuff from inetd.c -- POSIX says that the various
|
||
+ signal interfaces should not be mixed in the same program.
|
||
+ Because inetd uses 'most recent signal interface' it can find,
|
||
+ we should too.
|
||
+*/
|
||
+
|
||
+#define SIGBLOCK (sigmask(SIGCHLD)|sigmask(SIGHUP)|sigmask(SIGALRM))
|
||
+#if defined(HAVE_SIGACTION)
|
||
+# define SIGSTATUS sigset_t
|
||
+# define sigstatus_empty(s) sigemptyset(&s)
|
||
+#else
|
||
+# define SIGSTATUS long
|
||
+# define sigstatus_empty(s) s = 0
|
||
+#endif
|
||
+
|
||
+static void
|
||
+signal_set_handler (int signo, void (*handler) ())
|
||
+{
|
||
+#if defined(HAVE_SIGACTION)
|
||
+ struct sigaction sa;
|
||
+ memset ((char *)&sa, 0, sizeof(sa));
|
||
+ sigemptyset (&sa.sa_mask);
|
||
+ sigaddset (&sa.sa_mask, signo);
|
||
+#ifdef SA_RESTART
|
||
+ sa.sa_flags = SA_RESTART;
|
||
+#endif
|
||
+ sa.sa_handler = handler;
|
||
+ sigaction (signo, &sa, NULL);
|
||
+#elif defined(HAVE_SIGVEC)
|
||
+ struct sigvec sv;
|
||
+ memset (&sv, 0, sizeof(sv));
|
||
+ sv.sv_mask = SIGBLOCK;
|
||
+ sv.sv_handler = handler;
|
||
+ sigvec (signo, &sv, NULL);
|
||
+#else /* !HAVE_SIGVEC */
|
||
+ signal (signo, handler);
|
||
+#endif /* HAVE_SIGACTION */
|
||
+}
|
||
+
|
||
+static void
|
||
+signal_block (SIGSTATUS *old_status)
|
||
+{
|
||
+#ifdef HAVE_SIGACTION
|
||
+ sigset_t sigs;
|
||
+
|
||
+ sigemptyset (&sigs);
|
||
+ sigaddset (&sigs, SIGCHLD);
|
||
+ sigaddset (&sigs, SIGHUP);
|
||
+ sigaddset (&sigs, SIGALRM);
|
||
+ sigprocmask (SIG_BLOCK, &sigs, old_status);
|
||
+#else
|
||
+ long omask = sigblock (SIGBLOCK);
|
||
+ if (old_status)
|
||
+ *old_status = omask;
|
||
+#endif
|
||
+}
|
||
+
|
||
+static void
|
||
+signal_unblock (SIGSTATUS *status)
|
||
+{
|
||
+#ifdef HAVE_SIGACTION
|
||
+ if (status)
|
||
+ sigprocmask (SIG_SETMASK, status, 0);
|
||
+ else
|
||
+ {
|
||
+ sigset_t empty;
|
||
+ sigemptyset (&empty);
|
||
+ sigprocmask (SIG_SETMASK, &empty, 0);
|
||
+ }
|
||
+#else
|
||
+ sigsetmask (status ? *status : 0);
|
||
+#endif
|
||
+}
|
||
+
|
||
void
|
||
waitdaemon_timeout (int signo MAYBE_UNUSED)
|
||
{
|
||
int left;
|
||
|
||
left = alarm (0);
|
||
- signal (SIGALRM, SIG_DFL);
|
||
+ signal_set_handler (SIGALRM, SIG_DFL);
|
||
if (left == 0)
|
||
error (EXIT_FAILURE, 0, "timed out waiting for child");
|
||
}
|
||
@@ -136,9 +212,29 @@ waitdaemon (int nochdir, int noclose, in
|
||
default: /* In the parent. */
|
||
if (maxwait > 0)
|
||
{
|
||
- signal (SIGALRM, waitdaemon_timeout);
|
||
+ int status;
|
||
+ pid_t wpid;
|
||
+
|
||
+ signal_unblock(NULL);
|
||
+ signal_set_handler (SIGALRM, waitdaemon_timeout);
|
||
alarm (maxwait);
|
||
- pause ();
|
||
+ do
|
||
+ {
|
||
+ wpid = waitpid(childpid, &status, WUNTRACED
|
||
+#ifdef WCONTINUED /* Not all implementations support this */
|
||
+ | WCONTINUED
|
||
+#endif
|
||
+ );
|
||
+ if (wpid == -1)
|
||
+ {
|
||
+ /* should't happen for timeouts, because the
|
||
+ SIGALRM handler will error (and exit). However,
|
||
+ we may recieve some OTHER signal...
|
||
+ */
|
||
+ error (1, 0, "interrupted while waiting for child");
|
||
+ }
|
||
+ }
|
||
+ while (!WIFEXITED(status) && !WIFSIGNALED(status));
|
||
}
|
||
_exit (EXIT_SUCCESS);
|
||
}
|
||
@@ -150,7 +246,7 @@ waitdaemon (int nochdir, int noclose, in
|
||
then SIGHUP is sent to all process belonging to the same session,
|
||
i.e., also to the second child.
|
||
*/
|
||
- signal (SIGHUP, SIG_IGN);
|
||
+ signal_set_handler (SIGHUP, SIG_IGN);
|
||
|
||
switch (fork ())
|
||
{
|
||
@@ -200,5 +296,9 @@ waitdaemon (int nochdir, int noclose, in
|
||
int
|
||
daemon (int nochdir, int noclose)
|
||
{
|
||
+#ifdef __CYGWIN__
|
||
+ return (waitdaemon (nochdir, noclose, 5) == -1) ? -1 : 0;
|
||
+#else
|
||
return (waitdaemon (nochdir, noclose, 0) == -1) ? -1 : 0;
|
||
+#endif
|
||
}
|
||
--- origsrc/inetutils-2.6/libinetutils/logwtmp.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/libinetutils/logwtmp.c 2025-03-12 15:41:59.573352100 +0900
|
||
@@ -44,6 +44,10 @@
|
||
#endif
|
||
#include <string.h>
|
||
|
||
+#ifndef O_BINARY
|
||
+#define O_BINARY 0
|
||
+#endif
|
||
+
|
||
#ifdef HAVE_UTMPX_H
|
||
static void
|
||
_logwtmp (struct utmpx *ut)
|
||
@@ -56,9 +60,9 @@ _logwtmp (struct utmp *ut)
|
||
static int fd = -1;
|
||
|
||
if (fd < 0)
|
||
- fd = open (OUR_WTMP, O_WRONLY | O_APPEND, 0);
|
||
+ fd = open (OUR_WTMP, O_WRONLY | O_APPEND | O_BINARY, 0);
|
||
#else
|
||
- int fd = open (OUR_WTMP, O_WRONLY | O_APPEND, 0);
|
||
+ int fd = open (OUR_WTMP, O_WRONLY | O_APPEND | O_BINARY, 0);
|
||
#endif
|
||
|
||
if (fd >= 0)
|
||
--- origsrc/inetutils-2.6/libinetutils/setsig.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/libinetutils/setsig.c 2025-03-12 15:41:59.593352600 +0900
|
||
@@ -24,6 +24,10 @@
|
||
|
||
#include <signal.h>
|
||
|
||
+#ifdef __CYGWIN__
|
||
+typedef _sig_func_ptr sig_t;
|
||
+#endif
|
||
+
|
||
/* This is exactly like the traditional signal function, but turns on the
|
||
SA_RESTART bit where possible. */
|
||
sighandler_t
|
||
--- origsrc/inetutils-2.6/ping/ping.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/ping/ping.c 2025-03-12 15:41:59.603353200 +0900
|
||
@@ -277,8 +277,12 @@ main (int argc, char **argv)
|
||
setlocale (LC_ALL, "");
|
||
#endif
|
||
|
||
+#ifdef __CYGWIN__
|
||
+ is_root = true;
|
||
+#else
|
||
if (getuid () == 0)
|
||
is_root = true;
|
||
+#endif
|
||
|
||
/* Parse command line */
|
||
iu_argp_init ("ping", program_authors);
|
||
--- origsrc/inetutils-2.6/ping/ping6.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/ping/ping6.c 2025-03-12 15:41:59.613354200 +0900
|
||
@@ -143,6 +143,7 @@ parse_opt (int key, char *arg, struct ar
|
||
{
|
||
char *endptr;
|
||
static unsigned char pattern[MAXPATTERN];
|
||
+ double v;
|
||
|
||
switch (key)
|
||
{
|
||
@@ -170,9 +171,11 @@ parse_opt (int key, char *arg, struct ar
|
||
#endif
|
||
|
||
case 'i':
|
||
+ v = strtod (arg, &endptr);
|
||
+ if (*endptr)
|
||
+ argp_error (state, "invalid value (`%s' near `%s')", arg, endptr);
|
||
options |= OPT_INTERVAL;
|
||
- interval = ping_cvt_number (arg, 0, 0);
|
||
- interval *= PING_PRECISION;
|
||
+ interval = v * PING_PRECISION;
|
||
if (!is_root && interval < PING_MIN_USER_INTERVAL)
|
||
error (EXIT_FAILURE, 0, "option value too small: %s", arg);
|
||
break;
|
||
@@ -253,8 +256,12 @@ main (int argc, char **argv)
|
||
setlocale (LC_ALL, "");
|
||
#endif
|
||
|
||
+#ifdef __CYGWIN__
|
||
+ is_root = true;
|
||
+#else
|
||
if (getuid () == 0)
|
||
is_root = true;
|
||
+#endif
|
||
|
||
/* Parse command line */
|
||
iu_argp_init ("ping6", program_authors);
|
||
@@ -834,6 +841,7 @@ ping_init (int type MAYBE_UNUSED, int id
|
||
return NULL;
|
||
}
|
||
|
||
+#if defined(ICMP6_FILTER) & !defined(__CYGWIN__)
|
||
/* Tell which ICMPs we are interested in. */
|
||
ICMP6_FILTER_SETBLOCKALL (&filter);
|
||
ICMP6_FILTER_SETPASS (ICMP6_ECHO_REPLY, &filter);
|
||
@@ -849,13 +857,16 @@ ping_init (int type MAYBE_UNUSED, int id
|
||
close (fd);
|
||
return NULL;
|
||
}
|
||
+#endif
|
||
|
||
+#ifdef IPV6_RECVHOPLIMIT
|
||
err = setsockopt (fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &on, sizeof (on));
|
||
if (err)
|
||
{
|
||
close (fd);
|
||
return NULL;
|
||
}
|
||
+#endif
|
||
|
||
/* Allocate PING structure and initialize it to default values */
|
||
p = malloc (sizeof (*p));
|
||
--- origsrc/inetutils-2.6/src/Makefile.in 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/src/Makefile.in 2025-03-12 15:46:38.523535800 +0900
|
||
@@ -2166,6 +2166,7 @@ top_srcdir = @top_srcdir@
|
||
traceroute_BUILD = @traceroute_BUILD@
|
||
traceroute_INSTALL_HOOK = @traceroute_INSTALL_HOOK@
|
||
traceroute_PROPS = @traceroute_PROPS@
|
||
+traceroute_EXTRALIBS = @traceroute_EXTRALIBS@
|
||
uucpd_BUILD = @uucpd_BUILD@
|
||
uucpd_INSTALL_HOOK = @uucpd_INSTALL_HOOK@
|
||
uucpd_PROPS = @uucpd_PROPS@
|
||
@@ -2210,7 +2211,7 @@ tftp_SOURCES = tftp.c
|
||
tftp_LDADD = $(LDADD) $(LIBIDN)
|
||
traceroute_SOURCES = traceroute.c
|
||
traceroute_LDADD = $(top_builddir)/libicmp/libicmp.a $(LDADD) $(LIBIDN) \
|
||
- $(CLOCK_TIME_LIB) $(PTHREAD_SIGMASK_LIB) $(SELECT_LIB)
|
||
+ $(CLOCK_TIME_LIB) $(PTHREAD_SIGMASK_LIB) $(SELECT_LIB) $(traceroute_EXTRALIBS)
|
||
|
||
inetd_SOURCES = inetd.c
|
||
rexecd_SOURCES = rexecd.c
|
||
--- origsrc/inetutils-2.6/src/inetd.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/src/inetd.c 2025-03-12 15:41:59.643354600 +0900
|
||
@@ -136,6 +136,12 @@
|
||
#include "version-etc.h"
|
||
#include "attribute.h"
|
||
|
||
+#ifdef __CYGWIN__
|
||
+#include <windows.h>
|
||
+#include <sys/cygwin.h>
|
||
+#endif /* __CYGWIN__ */
|
||
+
|
||
+
|
||
#ifndef EAI_ADDRFAMILY
|
||
# define EAI_ADDRFAMILY 1
|
||
#endif
|
||
@@ -149,7 +155,14 @@
|
||
#endif
|
||
#define SIGBLOCK (sigmask(SIGCHLD)|sigmask(SIGHUP)|sigmask(SIGALRM))
|
||
|
||
+enum {
|
||
+ NO_DAEMON = 0,
|
||
+ UNIX_DAEMON
|
||
+};
|
||
+
|
||
bool debug = false;
|
||
+static int daemonize = UNIX_DAEMON;
|
||
+
|
||
int nsock, maxsock;
|
||
fd_set allsock;
|
||
int options;
|
||
@@ -197,6 +210,13 @@ static struct argp_option argp_options[]
|
||
{"resolve", OPT_RESOLVE, NULL, 0,
|
||
"resolve IP addresses when setting environment variables "
|
||
"(see --environment)", GRP + 1},
|
||
+#ifdef __CYGWIN__
|
||
+ {0,0,0,0,"Cygwin-specific options:",GRP + 2},
|
||
+ {"no-daemonize", 'D', NULL, 0,
|
||
+ "Do not run as a daemon", GRP + 2},
|
||
+ {"traditional-daemon", 'T', NULL, 0,
|
||
+ "This option is present for backwards compatibility.", GRP + 2},
|
||
+#endif /* __CYGWIN__ */
|
||
#undef GRP
|
||
{NULL, 0, NULL, 0, NULL, 0}
|
||
};
|
||
@@ -237,6 +257,16 @@ parse_opt (int key, char *arg, struct ar
|
||
resolve_option = true;
|
||
break;
|
||
|
||
+#ifdef __CYGWIN__
|
||
+ case 'D': /* don't become a daemon */
|
||
+ daemonize = NO_DAEMON;
|
||
+ break;
|
||
+
|
||
+ case 'T': /* act like a normal unix daemon */
|
||
+ daemonize = UNIX_DAEMON;
|
||
+ break;
|
||
+#endif /* __CYGWIN__ */
|
||
+
|
||
default:
|
||
return ARGP_ERR_UNKNOWN;
|
||
}
|
||
@@ -411,6 +441,44 @@ signal_unblock (SIGSTATUS *status)
|
||
#endif
|
||
}
|
||
|
||
+#ifdef __CYGWIN__
|
||
+void
|
||
+hide_console ()
|
||
+{
|
||
+ HMODULE lib;
|
||
+ HWND WINAPI (*GetConsoleWindow) (void) = NULL;
|
||
+ HWND console = NULL;
|
||
+
|
||
+ AllocConsole ();
|
||
+ if (lib = LoadLibrary ("kernel32.dll"))
|
||
+ GetConsoleWindow = (HWND WINAPI (*) (void))
|
||
+ GetProcAddress (lib, "GetConsoleWindow");
|
||
+
|
||
+ if (GetConsoleWindow)
|
||
+ /* If GetConsoleWindow exists (W2K and newer), use it. */
|
||
+ console = GetConsoleWindow ();
|
||
+ if (!console)
|
||
+ {
|
||
+ /* Get console window handle as described in KB article Q124103 */
|
||
+ char title[32];
|
||
+ snprintf (title, 32, "inetd.%d", getpid ());
|
||
+ SetConsoleTitle (title);
|
||
+ Sleep (40);
|
||
+ console = FindWindow (NULL, title);
|
||
+ if (console)
|
||
+ {
|
||
+ char ctitle[256];
|
||
+ if (!GetWindowText (console, ctitle, 256) || strcmp (title, ctitle))
|
||
+ console = NULL;
|
||
+ }
|
||
+ }
|
||
+ if (console)
|
||
+ ShowWindow (console, SW_HIDE);
|
||
+}
|
||
+#endif /* __CYGWIN__ */
|
||
+
|
||
+
|
||
+
|
||
void
|
||
run_service (int ctrl, struct servtab *sep)
|
||
{
|
||
@@ -430,6 +498,10 @@ run_service (int ctrl, struct servtab *s
|
||
close (ctrl);
|
||
dup2 (0, 1);
|
||
dup2 (0, 2);
|
||
+#ifdef __CYGWIN__
|
||
+ if (strcmp (sep->se_user, "root"))
|
||
+ {
|
||
+#endif
|
||
pwd = getpwnam (sep->se_user);
|
||
if (pwd == NULL)
|
||
{
|
||
@@ -451,6 +523,13 @@ run_service (int ctrl, struct servtab *s
|
||
_exit (EXIT_FAILURE);
|
||
}
|
||
}
|
||
+#ifdef __CYGWIN__
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ pwd = getpwuid (getuid ());
|
||
+ }
|
||
+#endif
|
||
if (pwd->pw_uid)
|
||
{
|
||
if (grp && grp->gr_gid)
|
||
@@ -464,8 +543,8 @@ run_service (int ctrl, struct servtab *s
|
||
}
|
||
else if (setgid (pwd->pw_gid) < 0)
|
||
{
|
||
- syslog (LOG_ERR, "%s: can't set gid %d: %m",
|
||
- sep->se_service, pwd->pw_gid);
|
||
+ syslog (LOG_ERR, "%s: can't set gid %d uid(%d): %m",
|
||
+ sep->se_service, pwd->pw_gid, pwd->pw_uid);
|
||
_exit (EXIT_FAILURE);
|
||
}
|
||
#ifdef HAVE_INITGROUPS
|
||
@@ -1271,6 +1350,10 @@ nextconfig (const char *file)
|
||
}
|
||
while ((sep = getconfigent (fconfig, file, &line)))
|
||
{
|
||
+#ifdef __CYGWIN__
|
||
+ if (strcmp (sep->se_user, "root"))
|
||
+ {
|
||
+#endif
|
||
pwd = getpwnam (sep->se_user);
|
||
if (pwd == NULL)
|
||
{
|
||
@@ -1288,6 +1371,9 @@ nextconfig (const char *file)
|
||
continue;
|
||
}
|
||
}
|
||
+#ifdef __CYGWIN__
|
||
+ }
|
||
+#endif
|
||
if (ISMUX (sep))
|
||
{
|
||
sep->se_fd = -1;
|
||
@@ -1491,10 +1577,48 @@ set_proc_title (char *a, int s)
|
||
}
|
||
else
|
||
snprintf (buf, sizeof buf, "-%s", a);
|
||
- strncpy (cp, buf, LastArg - cp);
|
||
- cp += strlen (cp);
|
||
- while (cp < LastArg)
|
||
- *cp++ = ' ';
|
||
+
|
||
+ /* the non-portable code in the #else block relies on
|
||
+ the system allocating all of the strings in argv[]
|
||
+ contiguously. On cygwin this is not necessarily so,
|
||
+ and to assume otherwise will lead to segfaults.
|
||
+ The downside here is we get supposed ps entries for
|
||
+ internal services like:
|
||
+ '-echo' instead of '-echo [remoteIP]' (okay?)
|
||
+ '-char' instead of '-chargen [remoteIP]' (awful)
|
||
+ '-disc' instead of '-discard [remoteIP]' (awful)
|
||
+ because the original argv[0] might be 'inetd' unless
|
||
+ it was specifically invoked with a full path. However,
|
||
+ this is mostly moot:
|
||
+ (1) cygwin's ps uses its own internal version of the
|
||
+ exe name (or GetModuleName) and then calls
|
||
+ cygwin_conv_xxx() for display.
|
||
+ (2) procps DOES use the modified argv[0] value
|
||
+ */
|
||
+ {
|
||
+#ifdef __CYGWIN__
|
||
+ char* LastNullChar = cp + strlen(cp);
|
||
+ char** scan;
|
||
+#else
|
||
+ char* LastNullChar = LastArg;
|
||
+#endif
|
||
+
|
||
+ strncpy (cp, buf, LastNullChar - cp);
|
||
+ cp += strlen (cp);
|
||
+ while (cp < LastNullChar)
|
||
+ *cp++ = ' ';
|
||
+
|
||
+#ifdef __CYGWIN__
|
||
+ /* individually blank out the rest of the args */
|
||
+ for (scan = Argv + 1; *scan != NULL; scan++)
|
||
+ {
|
||
+ char* nullChar = *scan + strlen(*scan);
|
||
+ cp = *scan;
|
||
+ while (cp < nullChar)
|
||
+ *cp++ = ' ';
|
||
+ }
|
||
+#endif
|
||
+ }
|
||
}
|
||
|
||
/*
|
||
@@ -1933,6 +2057,16 @@ main (int argc, char *argv[], char *envp
|
||
envp++;
|
||
LastArg = envp[-1] + strlen (envp[-1]);
|
||
|
||
+#ifdef __CYGWIN__
|
||
+ /* on cygwin, open the log early -- because even
|
||
+ help and cmdline processing messages go directly
|
||
+ to syslog. This is because inetd is often run
|
||
+ under the SYSTEM account (which is not quite like
|
||
+ the *nix 'root')
|
||
+ */
|
||
+ openlog("inetd", LOG_PID | LOG_NOWAIT, LOG_DAEMON);
|
||
+#endif
|
||
+
|
||
/* Parse command line */
|
||
iu_argp_init ("inetd", program_authors);
|
||
argp_parse (&argp, argc, argv, 0, &index, NULL);
|
||
@@ -1956,7 +2090,7 @@ main (int argc, char *argv[], char *envp
|
||
config_files[1] = newstr (PATH_INETDDIR);
|
||
}
|
||
|
||
- if (!debug)
|
||
+ if ((debug == 0) && daemonize)
|
||
{
|
||
if (daemon (0, 0) < 0)
|
||
{
|
||
@@ -1966,6 +2100,12 @@ main (int argc, char *argv[], char *envp
|
||
};
|
||
}
|
||
|
||
+#ifndef __CYGWIN__
|
||
+ exception_list except_list;
|
||
+ cygwin_internal (CW_INIT_EXCEPTIONS, &except_list);
|
||
+ hide_console ();
|
||
+#endif /* __CYGWIN__ */
|
||
+
|
||
openlog ("inetd", LOG_PID | LOG_NOWAIT, LOG_DAEMON);
|
||
|
||
if (pidfile_option)
|
||
@@ -1988,6 +2128,7 @@ main (int argc, char *argv[], char *envp
|
||
signal_set_handler (SIGCHLD, reapchild);
|
||
signal_set_handler (SIGPIPE, SIG_IGN);
|
||
|
||
+#ifndef __CYGWIN__
|
||
{
|
||
/* space for daemons to overwrite environment for ps */
|
||
#define DUMMYSIZE 100
|
||
@@ -1997,6 +2138,7 @@ main (int argc, char *argv[], char *envp
|
||
dummy[DUMMYSIZE - 1] = '\0';
|
||
setenv ("inetd_dummy", dummy, 1);
|
||
}
|
||
+#endif /* __CYGWIN__ */
|
||
|
||
for (;;)
|
||
{
|
||
--- origsrc/inetutils-2.6/src/rexecd.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/src/rexecd.c 2025-03-12 15:41:59.653352800 +0900
|
||
@@ -106,6 +106,11 @@
|
||
# include <xalloc.h>
|
||
#endif
|
||
|
||
+#ifdef __CYGWIN__
|
||
+#include <windows.h>
|
||
+#include <sys/cygwin.h>
|
||
+#endif
|
||
+
|
||
#include <progname.h>
|
||
#include <argp.h>
|
||
#include <error.h>
|
||
@@ -219,6 +224,27 @@ char *envinit[] = { homedir, shell, path
|
||
|
||
char *getstr (const char *);
|
||
|
||
+#ifdef __CYGWIN__
|
||
+static int
|
||
+do_cygwin_auth (const char* user, const char* passwd)
|
||
+{
|
||
+ struct passwd *p;
|
||
+ if ((user == NULL) || (user[0] == '\0'))
|
||
+ return 1;
|
||
+
|
||
+ /* can't "recreate" p from contents of pcred, because
|
||
+ struct passwd might contain extension elements
|
||
+ unknown to us
|
||
+ */
|
||
+ p = getpwnam (user);
|
||
+ if (p == NULL)
|
||
+ return 1;
|
||
+
|
||
+ HANDLE hToken = (HANDLE) cygwin_logon_user (p, passwd);
|
||
+ cygwin_set_impersonation_token (hToken);
|
||
+ return (hToken == INVALID_HANDLE_VALUE); // non-zero on error
|
||
+}
|
||
+#else /* __CYGWIN__ */
|
||
#ifndef WITH_PAM
|
||
static char *
|
||
get_user_password (struct passwd *pwd)
|
||
@@ -232,6 +258,7 @@ get_user_password (struct passwd *pwd)
|
||
return pw_text;
|
||
}
|
||
#endif /* !WITH_PAM */
|
||
+#endif /* __CYGWIN__ */
|
||
|
||
int
|
||
doit (int f, struct sockaddr *fromp, socklen_t fromlen)
|
||
@@ -239,7 +266,9 @@ doit (int f, struct sockaddr *fromp, soc
|
||
char *cmdbuf, *cp;
|
||
char *user, *pass;
|
||
#ifndef WITH_PAM
|
||
+#ifndef __CYGWIN__
|
||
char *namep, *pw_password;
|
||
+#endif /* __CYGWIN__ */
|
||
#endif
|
||
#ifdef HAVE_GETPWNAM_R
|
||
char *pwbuf;
|
||
@@ -368,6 +397,14 @@ doit (int f, struct sockaddr *fromp, soc
|
||
|
||
endpwent ();
|
||
|
||
+#ifdef __CYGWIN__
|
||
+ if (do_cygwin_auth (user, pass))
|
||
+ {
|
||
+ if (logging)
|
||
+ syslog (LOG_WARNING | LOG_AUTH, "Authentication failure. \"%s\"", user);
|
||
+ die (EXIT_FAILURE, "Login incorrect.");
|
||
+ }
|
||
+#else /* __CYGWIN__ */
|
||
#ifndef WITH_PAM
|
||
/* Last need of elevated privilege. */
|
||
pw_password = get_user_password (pwd);
|
||
@@ -437,6 +474,7 @@ doit (int f, struct sockaddr *fromp, soc
|
||
}
|
||
}
|
||
#endif /* WITH_PAM */
|
||
+#endif /* __CYGWIN__ */
|
||
|
||
#ifdef HAVE_SETLOGIN
|
||
if (setlogin (pwd->pw_name) < 0)
|
||
--- origsrc/inetutils-2.6/src/rlogind.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/src/rlogind.c 2025-03-12 15:41:59.663353000 +0900
|
||
@@ -851,6 +851,27 @@ rlogind_auth (int fd, struct auth_data *
|
||
confirmed = 0;
|
||
|
||
/* Check the remote host name */
|
||
+#ifdef __CYGWIN__
|
||
+ int is_localhost = 0;
|
||
+ struct in_addr adr = ((struct sockaddr_in *)&ap->from)->sin_addr;
|
||
+ struct in6_addr adr6 = ((struct sockaddr_in6 *)&ap->from)->sin6_addr;
|
||
+ switch (((struct sockaddr *)&ap->from)->sa_family)
|
||
+ {
|
||
+ case AF_INET:
|
||
+ if (IN_LOOPBACK (ntohl (adr.s_addr)))
|
||
+ is_localhost = 1;
|
||
+ break;
|
||
+ case AF_INET6:
|
||
+ if (IN6_IS_ADDR_LOOPBACK (&adr6))
|
||
+ is_localhost = 1;
|
||
+ }
|
||
+ if (is_localhost)
|
||
+ {
|
||
+ rc = 0;
|
||
+ strncpy (hoststr, "localhost", sizeof (hoststr));
|
||
+ }
|
||
+ else
|
||
+#endif /* __CYGWIN__ */
|
||
rc = getnameinfo ((struct sockaddr *) &ap->from, ap->fromlen,
|
||
hoststr, sizeof (hoststr), NULL, 0, NI_NAMEREQD);
|
||
if (!rc)
|
||
--- origsrc/inetutils-2.6/src/rshd.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/src/rshd.c 2025-03-12 15:41:59.673352200 +0900
|
||
@@ -708,6 +708,27 @@ doit (int sockfd, struct sockaddr *fromp
|
||
*/
|
||
errorstr = NULL;
|
||
#if HAVE_DECL_GETNAMEINFO
|
||
+#ifdef __CYGWIN__
|
||
+ int is_localhost = 0;
|
||
+ struct in_addr adr = ((struct sockaddr_in *)fromp)->sin_addr;
|
||
+ struct in6_addr adr6 = ((struct sockaddr_in6 *)fromp)->sin6_addr;
|
||
+ switch (fromp->sa_family)
|
||
+ {
|
||
+ case AF_INET:
|
||
+ if (IN_LOOPBACK (ntohl (adr.s_addr)))
|
||
+ is_localhost = 1;
|
||
+ break;
|
||
+ case AF_INET6:
|
||
+ if (IN6_IS_ADDR_LOOPBACK (&adr6))
|
||
+ is_localhost = 1;
|
||
+ }
|
||
+ if (is_localhost)
|
||
+ {
|
||
+ rc = 0;
|
||
+ strncpy (addrname, "localhost", sizeof (addrname));
|
||
+ }
|
||
+ else
|
||
+#endif /* __CYGWIN__ */
|
||
rc = getnameinfo (fromp, fromlen, addrname, sizeof (addrname),
|
||
NULL, 0, NI_NAMEREQD);
|
||
if (rc == 0)
|
||
--- origsrc/inetutils-2.6/src/syslogd.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/src/syslogd.c 2025-03-12 15:41:59.681371300 +0900
|
||
@@ -337,7 +337,8 @@ enum
|
||
OPT_NO_FORWARD = 256,
|
||
OPT_NO_KLOG,
|
||
OPT_NO_UNIXAF,
|
||
- OPT_IPANY
|
||
+ OPT_IPANY,
|
||
+ OPT_RCDIR
|
||
};
|
||
|
||
static struct argp_option argp_options[] = {
|
||
@@ -364,6 +365,7 @@ static struct argp_option argp_options[]
|
||
{"mark", 'm', "INTVL", 0, "specify timestamp interval in minutes"
|
||
" (0 for no timestamping)", GRP + 1},
|
||
{"no-detach", 'n', NULL, 0, "do not enter daemon mode", GRP + 1},
|
||
+ {"no-daemonize", 'D', NULL, 0, "Synonym for -n", GRP + 1},
|
||
{"no-forward", OPT_NO_FORWARD, NULL, 0, "do not forward any messages "
|
||
"(overrides --hop)", GRP + 1},
|
||
#ifdef PATH_KLOG
|
||
@@ -377,7 +379,7 @@ static struct argp_option argp_options[]
|
||
{"rcfile", 'f', "FILE", 0, "override configuration file (default: "
|
||
PATH_LOGCONF ")",
|
||
GRP + 1},
|
||
- {"rcdir", 'D', "DIR", 0, "override configuration directory (default: "
|
||
+ {"rcdir", OPT_RCDIR, "DIR", 0, "override configuration directory (default: "
|
||
PATH_LOGCONFD ")", GRP + 1},
|
||
{"socket", 'p', "FILE", 0, "override default unix domain socket " PATH_LOG,
|
||
GRP + 1},
|
||
@@ -449,6 +451,7 @@ parse_opt (int key, char *arg, struct ar
|
||
break;
|
||
|
||
case 'n':
|
||
+ case 'D':
|
||
NoDetach = 1;
|
||
break;
|
||
|
||
@@ -472,7 +475,7 @@ parse_opt (int key, char *arg, struct ar
|
||
ConfFile = arg;
|
||
break;
|
||
|
||
- case 'D':
|
||
+ case OPT_RCDIR:
|
||
ConfDir = arg;
|
||
break;
|
||
|
||
@@ -1127,7 +1130,11 @@ printsys (const char *msg)
|
||
char *lp, *q, line[MAXLINE + 1];
|
||
const char *p;
|
||
|
||
+#ifdef __CYGWIN__
|
||
+ strcpy (line, "kernel: ");
|
||
+#else
|
||
strcpy (line, "vmunix: ");
|
||
+#endif
|
||
lp = line + strlen (line);
|
||
for (p = msg; *p != '\0';)
|
||
{
|
||
--- origsrc/inetutils-2.6/src/tftpd.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/src/tftpd.c 2025-03-12 15:41:59.691394100 +0900
|
||
@@ -875,6 +875,27 @@ verifyhost (struct sockaddr_storage *fro
|
||
int rc;
|
||
static char host[NI_MAXHOST];
|
||
|
||
+#ifdef __CYGWIN__
|
||
+ int is_localhost = 0;
|
||
+ struct in_addr adr = ((struct sockaddr_in *)fromp)->sin_addr;
|
||
+ struct in6_addr adr6 = ((struct sockaddr_in6 *)fromp)->sin6_addr;
|
||
+ switch (((struct sockaddr *)fromp)->sa_family)
|
||
+ {
|
||
+ case AF_INET:
|
||
+ if (IN_LOOPBACK (ntohl (adr.s_addr)))
|
||
+ is_localhost = 1;
|
||
+ break;
|
||
+ case AF_INET6:
|
||
+ if (IN6_IS_ADDR_LOOPBACK (&adr6))
|
||
+ is_localhost = 1;
|
||
+ }
|
||
+ if (is_localhost)
|
||
+ {
|
||
+ rc = 0;
|
||
+ strncpy (host, "localhost", sizeof (host));
|
||
+ }
|
||
+ else
|
||
+#endif /* __CYGWIN__ */
|
||
rc = getnameinfo ((struct sockaddr *) fromp, frlen,
|
||
host, sizeof (host), NULL, 0, 0);
|
||
if (rc == 0)
|
||
--- origsrc/inetutils-2.6/src/traceroute.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/src/traceroute.c 2025-03-12 16:31:14.332186800 +0900
|
||
@@ -63,6 +63,12 @@
|
||
#include "xalloc.h"
|
||
#include "libinetutils.h"
|
||
|
||
+#ifdef __CYGWIN__
|
||
+#include <windows.h>
|
||
+#include <ipexport.h>
|
||
+#include <icmpapi.h>
|
||
+#endif
|
||
+
|
||
#define TRACE_UDP_PORT 33434
|
||
#define TRACE_TTL 1
|
||
|
||
@@ -81,6 +87,9 @@ typedef struct trace
|
||
struct sockaddr_in to, from;
|
||
int ttl;
|
||
struct timespec tsent;
|
||
+#ifdef __CYGWIN__
|
||
+ HANDLE hIcmp;
|
||
+#endif
|
||
} trace_t;
|
||
|
||
void trace_init (trace_t * t, const struct sockaddr_in to,
|
||
@@ -147,20 +156,28 @@ static struct argp_option argp_options[]
|
||
#define GRP 0
|
||
{"first-hop", 'f', "NUM", 0, "set initial hop distance, i.e., time-to-live",
|
||
GRP + 1},
|
||
+#ifndef __CYGWIN__
|
||
#ifdef IP_OPTIONS
|
||
{"gateways", 'g', "GATES", 0, "list of gateways for loose source routing",
|
||
GRP + 1},
|
||
#endif
|
||
{"icmp", 'I', NULL, 0, "use ICMP ECHO as probe", GRP + 1},
|
||
+#endif
|
||
{"max-hop", 'm', "NUM", 0, "set maximal hop count (default: 64)", GRP + 1},
|
||
+#ifndef __CYGWIN__
|
||
{"port", 'p', "PORT", 0, "use destination PORT port (default: 33434)",
|
||
GRP + 1},
|
||
+#endif
|
||
{"resolve-hostnames", OPT_RESOLVE, NULL, 0, "resolve hostnames", GRP + 1},
|
||
+#ifndef __CYGWIN__
|
||
{"tos", 't', "NUM", 0, "set type of service (TOS) to NUM", GRP + 1},
|
||
+#endif
|
||
{"tries", 'q', "NUM", 0, "send NUM probe packets per hop (default: 3)",
|
||
GRP + 1},
|
||
+#ifndef __CYGWIN__
|
||
{"type", 'M', "METHOD", 0, "use METHOD (`icmp' or `udp') for traceroute "
|
||
"operations, defaulting to `udp'", GRP + 1},
|
||
+#endif
|
||
{"wait", 'w', "NUM", 0, "wait NUM seconds for response (default: 3)",
|
||
GRP + 1},
|
||
#undef GRP
|
||
@@ -367,6 +384,52 @@ do_try (trace_t *trace, const int hop,
|
||
|
||
for (tries = 0; tries < max_tries; tries++)
|
||
{
|
||
+#ifdef __CYGWIN__
|
||
+ char data[] = "";
|
||
+ char buf[sizeof (ICMP_ECHO_REPLY) + sizeof (data) + 8];
|
||
+ IP_OPTION_INFORMATION ip_opt = {trace->ttl, 0, 0, 0, NULL};
|
||
+ ICMP_ECHO_REPLY *reply = (ICMP_ECHO_REPLY *) buf;
|
||
+ DWORD ret;
|
||
+
|
||
+ trace->tsent = current_timespec ();
|
||
+
|
||
+ ret = IcmpSendEcho2 (trace->hIcmp, NULL, NULL, NULL,
|
||
+ trace->to.sin_addr.s_addr, data, sizeof (data),
|
||
+ &ip_opt, buf, sizeof (buf), opt_wait * 1000);
|
||
+ usleep(0); /* Make signals such as SIGINT, SIGKILL, etc. work. */
|
||
+
|
||
+ diff = timespec_sub (current_timespec (), trace->tsent);
|
||
+
|
||
+ if (ret == 0)
|
||
+ {
|
||
+ if (reply->Status == IP_REQ_TIMED_OUT)
|
||
+ printf (" * ");
|
||
+ else
|
||
+ error (EXIT_FAILURE, errno, "IcmpSendEcho2 faild");
|
||
+ }
|
||
+ else if (ret == 1)
|
||
+ {
|
||
+ trace->from.sin_addr.s_addr = reply->Address;
|
||
+
|
||
+ if (tries == 0 || prev_addr != trace->from.sin_addr.s_addr)
|
||
+ {
|
||
+ printf (" %s ", inet_ntoa (trace->from.sin_addr));
|
||
+ if (opt_resolve_hostnames)
|
||
+ printf ("(%s) ",
|
||
+ get_hostname (&trace->from.sin_addr));
|
||
+ }
|
||
+ if (reply->Address == dest.sin_addr.s_addr
|
||
+ || reply->Status == IP_DEST_HOST_UNREACHABLE)
|
||
+ /* FIXME: Ugly hack. */
|
||
+ stop = 1;
|
||
+
|
||
+ triptime = timespectod (diff) * 1000.0;
|
||
+ printf (" %.3fms ", triptime);
|
||
+ prev_addr = trace->from.sin_addr.s_addr;
|
||
+ }
|
||
+ fflush (stdout);
|
||
+ }
|
||
+#else
|
||
int save_errno;
|
||
int fd = trace_icmp_sock (trace);
|
||
|
||
@@ -443,6 +506,7 @@ do_try (trace_t *trace, const int hop,
|
||
readonly = 0;
|
||
fflush (stdout);
|
||
}
|
||
+#endif
|
||
printf ("\n");
|
||
}
|
||
|
||
@@ -472,6 +536,9 @@ trace_init (trace_t *t, const struct soc
|
||
t->ttl = opt_ttl;
|
||
t->no_ident = 0;
|
||
|
||
+#ifdef __CYGWIN__
|
||
+ t->hIcmp = IcmpCreateFile ();
|
||
+#else
|
||
if (t->type == TRACE_UDP)
|
||
{
|
||
t->udpfd = socket (PF_INET, SOCK_DGRAM, 0);
|
||
@@ -535,6 +602,7 @@ trace_init (trace_t *t, const struct soc
|
||
if (setsockopt (fd, IPPROTO_IP, IP_OPTIONS, &ip_opts, len_ip_opts) < 0)
|
||
error (0, errno, "setsockopt(IPOPT_LSRR)");
|
||
#endif /* IP_OPTIONS */
|
||
+#endif /* __CYGWIN__ */
|
||
}
|
||
|
||
void
|
||
@@ -756,9 +824,11 @@ trace_inc_ttl (trace_t *t)
|
||
|
||
ttlp = &t->ttl;
|
||
t->ttl++;
|
||
+#ifndef __CYGWIN__
|
||
fd = (t->type == TRACE_UDP ? t->udpfd : t->icmpfd);
|
||
if (setsockopt (fd, IPPROTO_IP, IP_TTL, ttlp, sizeof (*ttlp)) < 0)
|
||
error (EXIT_FAILURE, errno, "setsockopt");
|
||
+#endif
|
||
}
|
||
|
||
void
|
||
--- origsrc/inetutils-2.6/src/uucpd.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/src/uucpd.c 2025-03-12 15:41:59.711392400 +0900
|
||
@@ -88,6 +88,12 @@
|
||
#include <attribute.h>
|
||
#include <libinetutils.h>
|
||
|
||
+#ifdef __CYGWIN__
|
||
+#include <windows.h>
|
||
+#include <sys/cygwin.h>
|
||
+#define is_winnt (GetVersion() < 0x80000000)
|
||
+#endif
|
||
+
|
||
void dologin (struct passwd *pw, struct sockaddr *sap, socklen_t salen);
|
||
void dologout (void);
|
||
void doit (struct sockaddr *sap, socklen_t salen);
|
||
@@ -178,6 +184,8 @@ readline (char *p, int n)
|
||
if (c == '\n' || c == '\r')
|
||
{
|
||
*p = '\0';
|
||
+ if (c == '\r')
|
||
+ continue;
|
||
return (0);
|
||
}
|
||
*p++ = c;
|
||
@@ -227,12 +235,29 @@ doit (struct sockaddr *sap, socklen_t sa
|
||
fprintf (stderr, "passwd read\n");
|
||
return;
|
||
}
|
||
+#ifdef __CYGWIN__
|
||
+ if (!is_winnt)
|
||
+ {
|
||
+#endif
|
||
xpasswd = crypt (passwd, pw->pw_passwd);
|
||
if (strcmp (xpasswd, pw->pw_passwd))
|
||
{
|
||
fprintf (stderr, "Login incorrect.");
|
||
return;
|
||
}
|
||
+#ifdef __CYGWIN__
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ HANDLE hToken = cygwin_logon_user (pw, passwd);
|
||
+ if (hToken == INVALID_HANDLE_VALUE)
|
||
+ {
|
||
+ fprintf (stderr, "Login incorrect.");
|
||
+ return;
|
||
+ }
|
||
+ cygwin_set_impersonation_token (hToken);
|
||
+ }
|
||
+#endif
|
||
}
|
||
|
||
/* XXX: Compare only shell base name to "uucico"?
|
||
--- origsrc/inetutils-2.6/talk/ctl.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/talk/ctl.c 2025-03-12 15:41:59.721391000 +0900
|
||
@@ -85,7 +85,7 @@ open_sockt (void)
|
||
#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
|
||
my_addr.sin_len = sizeof (my_addr);
|
||
#endif
|
||
- my_addr.sin_addr = my_machine_addr;
|
||
+ my_addr.sin_addr.s_addr = INADDR_ANY;
|
||
my_addr.sin_port = 0;
|
||
sockt = socket (AF_INET, SOCK_STREAM, 0);
|
||
if (sockt <= 0)
|
||
@@ -95,6 +95,7 @@ open_sockt (void)
|
||
length = sizeof (my_addr);
|
||
if (getsockname (sockt, (struct sockaddr *) &my_addr, &length) == -1)
|
||
p_error ("Bad address for socket");
|
||
+ my_addr.sin_addr = my_machine_addr;
|
||
|
||
return 0;
|
||
}
|
||
@@ -110,7 +111,7 @@ open_ctl (void)
|
||
ctl_addr.sin_len = sizeof (ctl_addr);
|
||
#endif
|
||
ctl_addr.sin_port = 0;
|
||
- ctl_addr.sin_addr = my_machine_addr;
|
||
+ ctl_addr.sin_addr.s_addr = INADDR_ANY;
|
||
ctl_sockt = socket (AF_INET, SOCK_DGRAM, 0);
|
||
if (ctl_sockt <= 0)
|
||
p_error ("Bad socket");
|
||
@@ -119,6 +120,7 @@ open_ctl (void)
|
||
length = sizeof (ctl_addr);
|
||
if (getsockname (ctl_sockt, (struct sockaddr *) &ctl_addr, &length) == -1)
|
||
p_error ("Bad address for ctl socket");
|
||
+ ctl_addr.sin_addr = my_machine_addr;
|
||
|
||
return 0;
|
||
}
|
||
--- origsrc/inetutils-2.6/talk/ctl_transact.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/talk/ctl_transact.c 2025-03-12 15:41:59.731395400 +0900
|
||
@@ -88,11 +88,11 @@ ctl_transact (struct in_addr target, CTL
|
||
*/
|
||
do
|
||
{
|
||
- wait.tv_sec = CTL_WAIT;
|
||
- wait.tv_usec = 0;
|
||
/* resend message until a response is obtained */
|
||
do
|
||
{
|
||
+ wait.tv_sec = CTL_WAIT;
|
||
+ wait.tv_usec = 0;
|
||
cc = sendto (ctl_sockt, (char *) &msg, sizeof (msg), 0,
|
||
(struct sockaddr *) &daemon_addr,
|
||
sizeof (daemon_addr));
|
||
--- origsrc/inetutils-2.6/talk/get_addrs.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/talk/get_addrs.c 2025-03-12 15:41:59.741393800 +0900
|
||
@@ -71,7 +71,11 @@ get_addrs (char *my_machine_name, char *
|
||
#if HAVE_DECL_GETADDRINFO || defined HAVE_IDN || defined HAVE_IDN2
|
||
int err;
|
||
#endif
|
||
+#ifdef HAVE_IDN
|
||
char *lhost, *rhost;
|
||
+#else
|
||
+ char *rhost;
|
||
+#endif
|
||
#if HAVE_DECL_GETADDRINFO
|
||
struct addrinfo hints, *res, *ai;
|
||
#else /* !HAVE_DECL_GETADDRINFO */
|
||
@@ -96,7 +100,6 @@ get_addrs (char *my_machine_name, char *
|
||
exit (-1);
|
||
}
|
||
#else /* !HAVE_IDN && !HAVE_IDN2 */
|
||
- lhost = my_machine_name;
|
||
rhost = his_machine_name;
|
||
#endif
|
||
|
||
@@ -114,16 +117,14 @@ get_addrs (char *my_machine_name, char *
|
||
hints.ai_flags |= AI_IDN;
|
||
# endif
|
||
|
||
- err = getaddrinfo (lhost, NULL, &hints, &res);
|
||
+ err = getaddrinfo (rhost, NULL, &hints, &res);
|
||
if (err)
|
||
{
|
||
- fprintf (stderr, "talk: %s: %s\n", lhost, gai_strerror (err));
|
||
+ fprintf (stderr, "talk: %s: %s\n", rhost, gai_strerror (err));
|
||
exit (-1);
|
||
}
|
||
|
||
- /* Perform all sanity checks available.
|
||
- * Reduction of tests?
|
||
- */
|
||
+ /* Perform all sanity checks available. */
|
||
for (ai = res; ai; ai = ai->ai_next)
|
||
{
|
||
int f;
|
||
@@ -135,98 +136,33 @@ get_addrs (char *my_machine_name, char *
|
||
if (f < 0)
|
||
continue;
|
||
|
||
- /* Attempt binding to this local address. */
|
||
- if (bind (f, ai->ai_addr, ai->ai_addrlen))
|
||
- {
|
||
- close (f);
|
||
- f = -1;
|
||
- continue;
|
||
- }
|
||
-
|
||
- /* We have a usable address. */
|
||
+ /* We have a usable address family! */
|
||
close (f);
|
||
break;
|
||
}
|
||
|
||
if (ai)
|
||
- memcpy (&my_machine_addr,
|
||
+ memcpy (&his_machine_addr,
|
||
&((struct sockaddr_in *) ai->ai_addr)->sin_addr,
|
||
- sizeof (my_machine_addr));
|
||
+ sizeof (his_machine_addr));
|
||
|
||
freeaddrinfo (res);
|
||
if (!ai)
|
||
{
|
||
- fprintf (stderr, "talk: %s: %s\n", lhost, "address not found");
|
||
+ fprintf (stderr, "talk: %s: %s\n", rhost, "address not found");
|
||
exit (-1);
|
||
}
|
||
|
||
#else /* !HAVE_DECL_GETADDRINFO */
|
||
- hp = gethostbyname (lhost);
|
||
+ hp = gethostbyname (rhost);
|
||
if (hp == NULL)
|
||
{
|
||
- fprintf (stderr, "talk: %s(%s): ", lhost, my_machine_name);
|
||
+ fprintf (stderr, "talk: %s(%s): ", rhost, his_machine_name);
|
||
herror ((char *) NULL);
|
||
exit (-1);
|
||
}
|
||
- memmove (&my_machine_addr, hp->h_addr, hp->h_length);
|
||
-#endif /* !HAVE_DECL_GETADDRINFO */
|
||
-
|
||
- /*
|
||
- * If the callee is on-machine, just copy the
|
||
- * network address, otherwise do a lookup...
|
||
- */
|
||
- if (strcmp (rhost, lhost))
|
||
- {
|
||
-#if HAVE_DECL_GETADDRINFO
|
||
- err = getaddrinfo (rhost, NULL, &hints, &res);
|
||
- if (err)
|
||
- {
|
||
- fprintf (stderr, "talk: %s: %s\n", rhost, gai_strerror (err));
|
||
- exit (-1);
|
||
- }
|
||
-
|
||
- /* Perform all sanity checks available. */
|
||
- for (ai = res; ai; ai = ai->ai_next)
|
||
- {
|
||
- int f;
|
||
-
|
||
- if (ai->ai_family != AF_INET)
|
||
- continue;
|
||
-
|
||
- f = socket (ai->ai_family, ai->ai_socktype, ai->ai_protocol);
|
||
- if (f < 0)
|
||
- continue;
|
||
-
|
||
- /* We have a usable address family! */
|
||
- close (f);
|
||
- break;
|
||
- }
|
||
-
|
||
- if (ai)
|
||
- memcpy (&his_machine_addr,
|
||
- &((struct sockaddr_in *) ai->ai_addr)->sin_addr,
|
||
- sizeof (his_machine_addr));
|
||
-
|
||
- freeaddrinfo (res);
|
||
- if (!ai)
|
||
- {
|
||
- fprintf (stderr, "talk: %s: %s\n", rhost, "address not found");
|
||
- exit (-1);
|
||
- }
|
||
-
|
||
-#else /* !HAVE_DECL_GETADDRINFO */
|
||
- hp = gethostbyname (rhost);
|
||
- if (hp == NULL)
|
||
- {
|
||
- fprintf (stderr, "talk: %s(%s): ", rhost, his_machine_name);
|
||
- herror ((char *) NULL);
|
||
- exit (-1);
|
||
- }
|
||
- memmove (&his_machine_addr, hp->h_addr, hp->h_length);
|
||
+ memmove (&his_machine_addr, hp->h_addr, hp->h_length);
|
||
#endif /* !HAVE_DECL_GETADDRINFO */
|
||
- }
|
||
- else
|
||
- his_machine_addr = my_machine_addr;
|
||
|
||
/* Find the server's port. */
|
||
sp = getservbyname ("ntalk", "udp");
|
||
@@ -238,6 +174,41 @@ get_addrs (char *my_machine_name, char *
|
||
}
|
||
daemon_port = ntohs (sp->s_port);
|
||
|
||
+ /* look up the address of the local host
|
||
+ which can communicate with remote host */
|
||
+ {
|
||
+ int f;
|
||
+ struct sockaddr_in addr;
|
||
+ socklen_t length;
|
||
+
|
||
+ f = socket (AF_INET, SOCK_DGRAM, 0);
|
||
+ if (f < 0)
|
||
+ {
|
||
+ fprintf (stderr, "talk: Bad socket: ");
|
||
+ herror ((char *) NULL);
|
||
+ exit (-1);
|
||
+ }
|
||
+ memset (&addr, 0, sizeof(addr));
|
||
+ addr.sin_family = AF_INET;
|
||
+ addr.sin_port = htons (daemon_port);
|
||
+ addr.sin_addr = his_machine_addr;
|
||
+ if (connect (f, (struct sockaddr *)&addr, sizeof(addr)) < 0)
|
||
+ {
|
||
+ fprintf (stderr, "talk: Coundn't connect to control socket: ");
|
||
+ herror ((char *) NULL);
|
||
+ exit (-1);
|
||
+ }
|
||
+ length = sizeof (addr);
|
||
+ if (getsockname (f, (struct sockaddr *)&addr, &length) < 0)
|
||
+ {
|
||
+ fprintf (stderr, "talk: Bad address for ctl socket: ");
|
||
+ herror ((char *) NULL);
|
||
+ exit (-1);
|
||
+ }
|
||
+ close (f);
|
||
+ my_machine_addr = addr.sin_addr;
|
||
+ }
|
||
+
|
||
#if defined HAVE_IDN || defined HAVE_IDN2
|
||
free (lhost);
|
||
free (rhost);
|
||
--- origsrc/inetutils-2.6/talk/io.c 2025-02-21 20:06:21.000000000 +0900
|
||
+++ src/inetutils-2.6/talk/io.c 2025-03-12 15:41:59.751391900 +0900
|
||
@@ -67,6 +67,8 @@
|
||
#include <sys/select.h>
|
||
#include "talk.h"
|
||
|
||
+#include <sys/socket.h>
|
||
+
|
||
#define A_LONG_TIME 10000000
|
||
|
||
/*
|