| /* |
| * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include <errno.h> |
| #include <fcntl.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <unistd.h> |
| |
| #include <sys/stat.h> |
| #include <sys/types.h> |
| |
| #include <sys/ioctl.h> |
| #include <sys/socket.h> |
| |
| #include <linux/if.h> |
| #include <linux/if_tun.h> |
| |
| static int |
| tun_alloc(char *dev) |
| { |
| struct ifreq ifr; |
| int fd, err; |
| |
| if ((fd = open ("/dev/net/tun", O_RDWR)) < 0) { |
| printf ("Error opening /dev/net/tun: %s\n", strerror (errno)); |
| return -1; |
| } |
| |
| memset (&ifr, 0, sizeof (ifr)); |
| |
| /* Flags: IFF_TUN - TUN device (no Ethernet headers) |
| * IFF_TAP - TAP device |
| * |
| * IFF_NO_PI - Do not provide packet information |
| */ |
| ifr.ifr_flags = IFF_TAP; |
| if (*dev) |
| strncpy (ifr.ifr_name, dev, IFNAMSIZ); |
| |
| if ((err = ioctl (fd, TUNSETIFF, (void *) &ifr)) < 0) { |
| printf ("Error calling TUNSETIFF: %s\n", strerror (errno)); |
| close (fd); |
| return err; |
| } |
| strncpy (dev, ifr.ifr_name, IFNAMSIZ); |
| return fd; |
| } |
| |
| int |
| main (int argc, const char *argv[]) |
| { |
| |
| int fd; |
| char namebuf[IFNAMSIZ]; |
| |
| strcpy (namebuf, "pseudo-modem%d"); |
| fd = tun_alloc (namebuf); |
| if (fd == -1) |
| exit (1); |
| |
| printf ("%s\n", namebuf); |
| fflush(stdout); |
| |
| while (1) |
| sleep (3600); |
| |
| return 0; |
| } |