diff src/process.c @ 47987:b30942bd85f3

(Fformat_network_address): New function. (syms_of_process): Defsubr it. (list_processes_1): Use it to format :local/:remote address if service/host is not set; before emacs would crash in that case. (Fmake_network_process): Don't use Ffind_operation_coding_system to setup coding system if host or service is not set.
author Kim F. Storm <storm@cua.dk>
date Thu, 24 Oct 2002 08:03:41 +0000
parents 62a08cd28e83
children f840e449c328
line wrap: on
line diff
--- a/src/process.c	Thu Oct 24 08:03:27 2002 +0000
+++ b/src/process.c	Thu Oct 24 08:03:41 2002 +0000
@@ -1043,6 +1043,54 @@
   return XPROCESS (process)->type;
 }
 #endif
+
+#ifdef HAVE_SOCKETS
+DEFUN ("format-network-address", Fformat_network_address, Sformat_network_address,
+       1, 1, 0,
+       doc: /* Convert network ADDRESS from internal format to a string.
+Returns nil if format of ADDRESS is invalid.  */)
+     (address)
+     Lisp_Object address;
+{
+  register struct Lisp_Vector *p;
+  register unsigned char *cp;
+  register int i;
+
+  if (NILP (address))
+    return Qnil;
+
+  if (STRINGP (address))  /* AF_LOCAL */
+    return address;
+
+  if (VECTORP (address))  /* AF_INET */
+    {
+      register struct Lisp_Vector *p = XVECTOR (address);
+      Lisp_Object args[6];
+
+      if (p->size != 5)
+	return Qnil;
+
+      args[0] = build_string ("%d.%d.%d.%d:%d");
+      args[1] = XINT (p->contents[0]);
+      args[2] = XINT (p->contents[1]);
+      args[3] = XINT (p->contents[2]);
+      args[4] = XINT (p->contents[3]);
+      args[5] = XINT (p->contents[4]);
+      return Fformat (6, args);
+    }
+
+  if (CONSP (address))
+    {
+      Lisp_Object args[2];
+      args[0] = build_string ("<Family %d>");
+      args[1] = XINT (Fcar (address));
+      return Fformat (2, args);
+      
+    }
+
+  return Qnil;
+}
+#endif
 
 Lisp_Object
 list_processes_1 (query_only)
@@ -1204,9 +1252,11 @@
 	  Lisp_Object port = Fplist_get (p->childp, QCservice);
 	  if (INTEGERP (port))
 	    port = Fnumber_to_string (port);
+	  if (NILP (port))
+	    port = Fformat_network_address (Fplist_get (p->childp, QClocal));
 	  sprintf (tembuf, "(network %s server on %s)\n",
 		   (DATAGRAM_CHAN_P (XINT (p->infd)) ? "datagram" : "stream"),
-		   SDATA (port));
+		   (STRINGP (port) ? (char *)SDATA (port) : "?"));
 	  insert_string (tembuf);
 	}
       else if (NETCONN1_P (p))
@@ -1220,9 +1270,11 @@
 	      if (INTEGERP (host))
 		host = Fnumber_to_string (host);
 	    }
+	  if (NILP (host))
+	    host = Fformat_network_address (Fplist_get (p->childp, QCremote));
 	  sprintf (tembuf, "(network %s connection to %s)\n",
 		   (DATAGRAM_CHAN_P (XINT (p->infd)) ? "datagram" : "stream"),
-		   SDATA (host));
+		   (STRINGP (host) ? (char *)SDATA (host) : "?"));
 	  insert_string (tembuf);
         }
       else 
@@ -2498,7 +2550,7 @@
 :sentinel SENTINEL -- Install SENTINEL as the process sentinel.
 
 :log LOG -- Install LOG as the server process log function.  This
-function is called as when the server accepts a network connection from a
+function is called when the server accepts a network connection from a
 client.  The arguments are SERVER, CLIENT, and MESSAGE, where SERVER
 is the server process, CLIENT is the new process for the connection,
 and MESSAGE is a string.
@@ -3134,11 +3186,16 @@
       val = Qnil;
     else
       {
-	args[0] = Qopen_network_stream, args[1] = name,
-	  args[2] = buffer, args[3] = host, args[4] = service;
-	GCPRO1 (proc);
-	coding_systems = Ffind_operation_coding_system (5, args);
-	UNGCPRO;
+	if (NILP (host) || NILP (service))
+	  coding_systems = Qnil;
+	else
+	  {
+	    args[0] = Qopen_network_stream, args[1] = name,
+	      args[2] = buffer, args[3] = host, args[4] = service;
+	    GCPRO1 (proc);
+	    coding_systems = Ffind_operation_coding_system (5, args);
+	    UNGCPRO;
+	  }
 	if (CONSP (coding_systems))
 	  val = XCAR (coding_systems);
 	else if (CONSP (Vdefault_process_coding_system))
@@ -3158,11 +3215,16 @@
       {
 	if (EQ (coding_systems, Qt))
 	  {
-	    args[0] = Qopen_network_stream, args[1] = name,
-	      args[2] = buffer, args[3] = host, args[4] = service;
-	    GCPRO1 (proc);
-	    coding_systems = Ffind_operation_coding_system (5, args);
-	    UNGCPRO;
+	    if (NILP (host) || NILP (service))
+	      coding_systems = Qnil;
+	    else
+	      {
+		args[0] = Qopen_network_stream, args[1] = name,
+		  args[2] = buffer, args[3] = host, args[4] = service;
+		GCPRO1 (proc);
+		coding_systems = Ffind_operation_coding_system (5, args);
+		UNGCPRO;
+	      }
 	  }
 	if (CONSP (coding_systems))
 	  val = XCDR (coding_systems);
@@ -6232,6 +6294,7 @@
 #ifdef HAVE_SOCKETS
   defsubr (&Sset_network_process_options);
   defsubr (&Smake_network_process);
+  defsubr (&Sformat_network_address);
 #endif /* HAVE_SOCKETS */
 #ifdef DATAGRAM_SOCKETS
   defsubr (&Sprocess_datagram_address);