* not supported). If no additional routes are to be set up, use `-'
* or supply an empty argument.
*
- * Each <config> item - whether a line file such as
- * /etc/userv/ipif-networks, or supplied on the service program
- * command line - is one of:
+ * Each <config> item - whether a line in a file such as
+ * /etc/userv/ipif-networks, or the single trusted argument supplied
+ * on the service program command line - is one of:
*
* /<config-file-name>
* ./<config-file-name>
* The service program should be run from userv with no-disconnect-hup.
*/
/*
- * Copyright (C) 1999-2000,2003 Ian Jackson
* This file is part of ipif, part of userv-utils
*
+ * Copyright 1996-2013 Ian Jackson <ijackson@chiark.greenend.org.uk>
+ * Copyright 1998 David Damerell <damerell@chiark.greenend.org.uk>
+ * Copyright 1999,2003
+ * Chancellor Masters and Scholars of the University of Cambridge
+ * Copyright 2010 Tony Finch <fanf@dotat.at>
+ *
* This 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
+ * the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with userv-utils; if not, write to the Free Software
- * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * $Id$
+ * along with userv-utils; if not, see http://www.gnu.org/licenses/.
*/
#include <stdio.h>
}
static void rx_packet(const uint8_t *packet, int len) {
+ if (!len)
+ return;
for (;;) {
int r= write(tunfd, packet, len);
if (r<0) {
if (errno==EINTR) continue;
- if (errno==EAGAIN) return; /* oh well */
+ if (errno==EAGAIN || errno==ENOMEM) return; /* oh well */
sysfatal("error writing packet to tun (transmitting)");
}
assert(r==len);
r= read(0, input_buf + input_waiting, want);
if (r>0) {
input_waiting += r;
- assert(r < sizeof(input_buf));
+ assert(input_waiting <= sizeof(input_buf));
more_rx_data(input_buf, rx_packet_buf);
} else if (r==0) {
terminate(0);