/* -*-c-*-
- *
- * $Id$
*
* Tunnel packets via SLIP
*
* (c) 2005 Straylight/Edgeware
*/
-/*----- Licensing notice --------------------------------------------------*
+/*----- Licensing notice --------------------------------------------------*
*
* This file is part of Trivial IP Encryption (TrIPE).
*
* 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.
- *
+ *
* TrIPE 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 TrIPE; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# define ST_EOF 4u /* File descriptor reported EOF */
size_t n; /* Number of bytes used in buffer */
octet buf[PKBUFSZ]; /* Buffer for incoming data */
-};
+};
/*----- Static variables --------------------------------------------------*/
/*----- 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
#endif
errno == EAGAIN)
return;
- a_warn("TUN", "%s", t->sl->name, "read-error", "?ERRNO", A_END);
+ a_warn("TUN", "%s", p_ifname(t->p), "read-error", "?ERRNO", A_END);
return;
}
if (!n) {
- a_warn("TUN", "%s", t->sl->name, "slip", "eof", A_END);
+ a_warn("TUN", "%s", p_ifname(t->p), "slip", "eof", A_END);
t->st = ST_EOF;
sel_rmfile(&t->f);
return;
if (st & ST_BAD)
;
else if (st & ST_ESC)
- a_warn("TUN", "%s", t->sl->name, "slip", "escape-end", A_END);
+ a_warn("TUN", "%s", p_ifname(t->p), "slip", "escape-end", A_END);
else if (q == t->buf) {
T( trace(T_TUNNEL, "tun-slip: empty packet"); )
} else {
break;
case SL_ESC:
if ((st & ST_ESC) && !(st & ST_BAD)) {
- a_warn("TUN", "%s", t->sl->name, "slip", "bad-escape", A_END);
+ a_warn("TUN", "%s", p_ifname(t->p), "slip", "bad-escape", A_END);
st |= ST_BAD;
} else
st |= ST_ESC;
goto emit;
default:
if ((st & ST_ESC) && !(st & ST_BAD)) {
- a_warn("TUN", "%s", t->sl->name, "slip", "bad-escape", A_END);
+ a_warn("TUN", "%s", p_ifname(t->p), "slip", "bad-escape", A_END);
st |= ST_BAD;
}
emit:
if (q < ll)
*q++ = o;
else {
- a_warn("TUN", "%s", t->sl->name, "slip", "overflow", A_END);
+ a_warn("TUN", "%s", p_ifname(t->p), "slip", "overflow", A_END);
st |= ST_BAD;
}
}
/* --- @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.
*
* Use: Initializes a new tunnel.
*/
-static tunnel *t_create(peer *p)
+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;
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);
}
sel_initfile(&sel, &t->f, sl->ifd, SEL_READ, t_read, t);
sel_addfile(&t->f);
write(sl->ofd, end, sizeof(end));
+ *ifn = xstrdup(sl->name);
dstr_destroy(&d);
return (t);
return (0);
}
-/* --- @t_ifname@ --- *
+/* --- @t_setifname@ --- *
*
* Arguments: @tunnel *t@ = pointer to tunnel block
+ * @const char *ifn@ = new interface name
+ *
+ * Returns: ---
*
- * Returns: A pointer to the tunnel's interface name.
+ * Use: Updates the interface name of a slip interface.
*/
-static const char *t_ifname(tunnel *t) { return (t->sl->name); }
+static void t_setifname(tunnel *t, const char *ifn)
+ { xfree(t->sl->name); t->sl->name = xstrdup(ifn); }
/* --- @t_inject@ --- *
*
const tunnel_ops tun_slip = {
"slip",
+ 0,
t_init,
t_create,
- t_ifname,
+ t_setifname,
t_inject,
t_destroy
};