File xrdp-avahi.diff of Package xrdp

Index: b/configure.ac
===================================================================
--- a/configure.ac	2020-03-11 15:31:17.466041360 +0800
+++ b/configure.ac	2020-03-11 15:31:17.466041360 +0800
@@ -9,6 +9,7 @@ AC_PROG_CC
 AC_C_CONST
 AC_PROG_LIBTOOL
 
+PKG_CHECK_MODULES(AVAHI, avahi-client >= 0.6.4)
 PKG_PROG_PKG_CONFIG
 if test "x$PKG_CONFIG" = "x"; then
   AC_MSG_ERROR([please install pkg-config])
Index: b/xrdp/Makefile.am
===================================================================
--- a/xrdp/Makefile.am	2020-03-11 15:31:17.466041360 +0800
+++ b/xrdp/Makefile.am	2020-03-11 15:31:17.466041360 +0800
@@ -12,7 +12,9 @@ AM_CPPFLAGS = \
   -DXRDP_SOCKET_PATH=\"${socketdir}\" \
   -I$(top_builddir) \
   -I$(top_srcdir)/common \
-  -I$(top_srcdir)/libxrdp
+  -I$(top_srcdir)/libxrdp \
+  $(AVAHI_CFLAGS)
+
 
 XRDP_EXTRA_LIBS =
 
@@ -46,6 +48,7 @@ xrdp_SOURCES = \
   lang.c \
   xrdp.c \
   xrdp.h \
+  xrdp_avahi.c \
   xrdp_bitmap.c \
   xrdp_cache.c \
   xrdp_encoder.c \
@@ -63,7 +66,8 @@ xrdp_SOURCES = \
 xrdp_LDADD = \
   $(top_builddir)/common/libcommon.la \
   $(top_builddir)/libxrdp/libxrdp.la \
-  $(XRDP_EXTRA_LIBS)
+  $(XRDP_EXTRA_LIBS) \
+  $(AVAHI_LIBS)
 
 xrdpsysconfdir=$(sysconfdir)/xrdp
 
Index: b/xrdp/xrdp.h
===================================================================
--- a/xrdp/xrdp.h	2020-03-11 15:31:17.466041360 +0800
+++ b/xrdp/xrdp.h	2020-03-11 15:31:17.466041360 +0800
@@ -527,3 +527,10 @@ server_add_char_alpha(struct xrdp_mod* m
 int
 server_session_info(struct xrdp_mod *mod, const char *data, int data_bytes);
 
+/* xrdp_avahi.c */
+int
+xrdp_avahi_init(void);
+void
+xrdp_avahi_fini(void);
+void
+xrdp_avahi_get_port(char *port);
Index: b/xrdp/xrdp_avahi.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ b/xrdp/xrdp_avahi.c	2020-03-11 15:46:17.611966870 +0800
@@ -0,0 +1,176 @@
+/*
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+   xrdp: A Remote Desktop Protocol server.
+   Copyright (C) Novell, Inc. 2008
+
+   avahi integration
+
+*/
+
+#include <stdio.h>
+#include <unistd.h>
+
+#include <avahi-client/client.h>
+#include <avahi-client/publish.h>
+#include <avahi-common/thread-watch.h>
+#include <xrdp.h>
+
+static AvahiClient       *client = NULL;
+static AvahiThreadedPoll *threaded_poll = NULL;
+static AvahiEntryGroup   *avahi_group = NULL;
+
+static const char *_service_name = "RDP service on %s";
+
+static void
+avahi_client_callback (AvahiClient      *c,
+		       AvahiClientState state,
+		       void             *userdata)
+{
+    switch (state) {
+    case AVAHI_CLIENT_S_RUNNING:
+	avahi_group = avahi_entry_group_new (c, 0, 0);
+	if (avahi_group)
+	{
+	    char hname[512];
+	    char name[576];
+	    char port[8];
+
+	    if (gethostname (hname, sizeof (hname)))
+		break;
+
+	    sprintf (name, _service_name, hname);
+
+	    xrdp_avahi_get_port (port);
+
+	    avahi_entry_group_add_service (avahi_group,
+					   AVAHI_IF_UNSPEC,
+					   AVAHI_PROTO_UNSPEC,
+					   0,
+					   name,
+					   "_rdp._tcp",
+					   0,
+					   0,
+					   atoi (port),
+					   NULL);
+
+	    avahi_entry_group_commit (avahi_group);
+	}
+	break;
+    case AVAHI_CLIENT_FAILURE:
+    case AVAHI_CLIENT_S_COLLISION:
+    case AVAHI_CLIENT_CONNECTING:
+	break;
+    case AVAHI_CLIENT_S_REGISTERING:
+	if (avahi_group)
+	    avahi_entry_group_reset (avahi_group);
+    default:
+	break;
+    }
+}
+
+int
+xrdp_avahi_init (void)
+{
+    if (!(threaded_poll = avahi_threaded_poll_new ()))
+	return 1;
+
+    if (!(client = avahi_client_new (avahi_threaded_poll_get (threaded_poll),
+				    0,
+				    avahi_client_callback,
+				    NULL,
+				    NULL)))
+       return 1;
+
+   if (avahi_threaded_poll_start (threaded_poll) < 0)
+       return 1;
+
+   return 0;
+}
+
+void
+xrdp_avahi_fini (void)
+{
+    avahi_threaded_poll_stop (threaded_poll);
+    if (avahi_group)
+	avahi_entry_group_free (avahi_group);
+    avahi_client_free (client);
+    avahi_threaded_poll_free (threaded_poll);
+}
+
+void
+xrdp_avahi_get_port(char *port)
+{
+    const int port_bytes = 8;
+    int fd;
+    char cfg_file[256];
+
+    /* default to port 3389 */
+    g_strncpy(port, "3389", port_bytes - 1);
+
+    /* see if port or address is in xrdp.ini file */
+    g_snprintf(cfg_file, 255, "%s/xrdp.ini", XRDP_CFG_PATH);
+    fd = g_file_open(cfg_file);
+
+    if (fd != -1)
+    {
+        struct list *names;
+        struct list *values;
+
+        names = list_create();
+        names->auto_free = 1;
+        values = list_create();
+        values->auto_free = 1;
+
+        if (file_read_section(fd, "globals", names, values) == 0)
+        {
+            int index;
+            char *val;
+
+            for (index = 0; index < names->count; index++)
+            {
+                val = (char *)list_get_item(names, index);
+
+                if (val != 0)
+                {
+                    if (g_strcasecmp(val, "port") == 0)
+                    {
+                        val = (char *)list_get_item(values, index);
+                        if (val[0] == '/')
+                        {
+                            g_strncpy(port, val, port_bytes - 1);
+                        }
+                        else
+                        {
+                            int error;
+
+                            error = g_atoi(val);
+                            if ((error > 0) && (error < 65000))
+                            {
+                                g_strncpy(port, val, port_bytes - 1);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        list_delete(names);
+        list_delete(values);
+    }
+
+    if (fd != -1)
+        g_file_close(fd);
+}
Index: b/common/arch.h
===================================================================
--- a/common/arch.h	2020-03-11 15:31:17.466041360 +0800
+++ b/common/arch.h	2020-03-11 15:31:17.466041360 +0800
@@ -20,28 +20,7 @@
 #define ARCH_H
 
 #include <stdlib.h>
-
-#if defined(HAVE_STDINT_H)
 #include <stdint.h>
-#else
-typedef signed char int8_t;
-typedef unsigned char uint8_t;
-typedef signed short int16_t;
-typedef unsigned short uint16_t;
-typedef signed int int32_t;
-typedef unsigned int uint32_t;
-#if defined(_WIN64)
-typedef signed __int64 int64_t;
-typedef unsigned __int64 uint64_t;
-typedef signed __int64 intptr_t;
-typedef unsigned __int64 uintptr_t;
-#else
-typedef signed long long int64_t;
-typedef unsigned long long uint64_t;
-typedef signed long intptr_t;
-typedef unsigned long uintptr_t;
-#endif
-#endif
 
 typedef int bool_t;
openSUSE Build Service is sponsored by