chiark / gitweb /
server/tun-slip.c: Pass correct stdout to child process.
[tripe] / server / tun-slip.c
index 785d008f6c31ef15e2a8727ed8af1d3e88f9c590..264d1d42477ab166b2765b3003c8aa90f6f91159 100644 (file)
@@ -1,6 +1,4 @@
 /* -*-c-*-
- *
- * $Id$
  *
  * Tunnel packets via SLIP
  *
@@ -64,11 +62,6 @@ static const char *slipcmd;          /* Script to make new interfaces */
 
 /*----- Main code ---------------------------------------------------------*/
 
-#define SL_END 0xc0
-#define SL_ESC 0xdb
-#define SL_ESCEND 0xdc
-#define SL_ESCESC 0xdd
-
 /* --- @t_read@ --- *
  *
  * Arguments:  @int fd@ = file descriptor to read
@@ -253,6 +246,7 @@ whine:
 /* --- @t_create@ --- *
  *
  * Arguments:  @peer *p@ = pointer to peer block
+ *             @int fd@ = file descriptor of tunnel device (unused)
  *             @char **ifn@ = where to put the interface name
  *
  * Returns:    A tunnel block if it worked, or null on failure.
@@ -260,10 +254,11 @@ whine:
  * Use:                Initializes a new tunnel.
  */
 
-static tunnel *t_create(peer *p, char **ifn)
+static tunnel *t_create(peer *p, int fd, char **ifn)
 {
   slipif *sl = 0;
   int pin[2] = { -1, -1 }, pout[2] = { -1, -1 };
+  mdup_fd md[2];
   pid_t kid = -1;
   dstr d = DSTR_INIT;
   unsigned char ch;
@@ -298,10 +293,10 @@ static tunnel *t_create(peer *p, char **ifn)
     goto fail;
   }
   if (!kid) {
-    close(pin[1]);
-    close(pout[0]);
-    dup2(pin[0], STDIN_FILENO);
-    dup2(pout[1], STDOUT_FILENO);
+    close(pin[1]); close(pout[0]);
+    md[0].cur = pin[0];  md[0].want = STDIN_FILENO;
+    md[1].cur = pout[1]; md[1].want = STDOUT_FILENO;
+    mdup(md, 2);
     execlp(slipcmd, slipcmd, p_name(p), (char *)0);
     _exit(127);
   }
@@ -446,6 +441,7 @@ static void t_destroy(tunnel *t)
 
 const tunnel_ops tun_slip = {
   "slip",
+  0,
   t_init,
   t_create,
   t_setifname,