pppd: Close already open ppp descriptors

When using the kernel PPPoE driver in conjunction with the "persist" option,
the already open descriptor to /dev/ppp is not closed when the link is
reestablished. This eventually leads to high CPU load because the stray 
descriptors are always reported as ready by select().

This patch closes the descriptor if it is already open when establishing a
new connection. It originated from the Debian project.

Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>

--- a/pppd/sys-linux.c
+++ b/pppd/sys-linux.c
@@ -458,6 +458,13 @@ int generic_establish_ppp (int fd)
     if (new_style_driver) {
 	int flags;
 
+        /* if a ppp_fd is already open, close it first */
+        if(ppp_fd > 0) {
+          close(ppp_fd);
+          remove_fd(ppp_fd);
+          ppp_fd = -1;
+        }
+
 	/* Open an instance of /dev/ppp and connect the channel to it */
 	if (ioctl(fd, PPPIOCGCHAN, &chindex) == -1) {
 	    error("Couldn't get channel number: %m");
