Hi,

Attached is an alternative and less intrusive patch by Alfred M. Szmidt
<[EMAIL PROTECTED]>.  This is its arch archive location:

http://www.update.uu.se/~ams/{archives}/2005-update
[EMAIL PROTECTED]/hackerlab/hackerlab--gnu

Is that reasonable enough to go in?  I verified it still builds fine on
GNU/Linux.


cheers,

Michael

-- 
Michael Banck
Debian Developer
[EMAIL PROTECTED]
http://www.advogato.org/person/mbanck/diary.html
--- tla-1.3.3/src/hackerlab/vu-network/url-socket.c     2005-12-28 
02:10:35.000000000 +0100
+++ tla-1.3.3/src/hackerlab/vu-network/url-socket.c     2005-12-28 
02:10:37.000000000 +0100
@@ -1403,7 +1403,7 @@
   int fd;
   struct url_socket_params params;
   struct sockaddr_in addr;
-  t_uchar myhost[MAXHOSTNAMELEN + 1];
+  t_uchar *myhost;
 
   mem_set0 ((t_uchar *)&addr, sizeof (addr));
 
@@ -1414,10 +1414,20 @@
     {
       if (host_id_is)
        {
-         if (0 > gethostname (myhost, sizeof (myhost)))
+         size_t size = 64;
+         int err;
+         myhost = (t_uchar *) must_malloc (size + 1);
+         while (1)
            {
-             *errn = errno;
-             return -1;
+             int i = size - 1;
+             myhost[i] = '\0';
+             err = gethostname (myhost, size);
+             if (err >= 0 && myhost[i] == '\0')
+               break;
+             else if (err < 0 && errno != ENAMETOOLONG && errno != 0)
+               must_free (myhost);
+             size *= 2;
+             myhost = must_realloc (myhost, size + 1);
            }
          *host_id_is = str_save (limits, myhost);
        }
@@ -1479,17 +1489,25 @@
            }
          else
            {
-             char my_name[MAXHOSTNAMELEN + 1];
              struct hostent * hostent;
-         
-             if (0 > gethostname (my_name, sizeof (my_name)))
+             size_t size = 64;
+             int err;
+             t_uchar *my_name;
+
+             my_name = (t_uchar *) must_malloc (size + 1);
+             while (1)
                {
-                 int ign;
-                 *errn = errno;
-                 vu_close (&ign, fd);
-                 return -1;
+                 int i = size - 1;
+                 my_name[i] = '\0';
+                 err = gethostname (my_name, size);
+                 if (err >= 0 && my_name[i] == '\0')
+                   break;
+                 else if (err < 0 && errno != ENAMETOOLONG && errno != 0)
+                   must_free (my_name);
+                 size *= 2;
+                 my_name = must_realloc (my_name, size + 1);
                }
-
+         
              hostent = gethostbyname (my_name);
              if (!hostent)
                {

Reply via email to