MSYS2-packages/inetutils/inetutils-2.6-1.src.patch
Christoph Reiter 9dcda8aee9
inetutils: Update to 2.6 (#5433)
Sync with cygwin

001-missing-include.patch: fixed upstream
2025-06-03 09:17:43 +02:00

2071 lines
57 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--- 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
/*