1 /* 2 * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. 3 * Use of this source code is governed by a BSD-style license that can be 4 * found in the LICENSE file. 5 */ 6 7 #include <errno.h> 8 #include <fcntl.h> 9 #include <stdio.h> 10 #include <stdlib.h> 11 #include <string.h> 12 #include <unistd.h> 13 14 #include <sys/stat.h> 15 #include <sys/types.h> 16 17 #include <sys/ioctl.h> 18 #include <sys/socket.h> 19 20 #include <linux/if.h> 21 #include <linux/if_tun.h> 22 23 static int 24 tun_alloc(char *dev) 25 { 26 struct ifreq ifr; 27 int fd, err; 28 29 if ((fd = open ("/dev/net/tun", O_RDWR)) < 0) { 30 printf ("Error opening /dev/net/tun: %s\n", strerror (errno)); 31 return -1; 32 } 33 34 memset (&ifr, 0, sizeof (ifr)); 35 36 /* Flags: IFF_TUN - TUN device (no Ethernet headers) 37 * IFF_TAP - TAP device 38 * 39 * IFF_NO_PI - Do not provide packet information 40 */ 41 ifr.ifr_flags = IFF_TAP; 42 if (*dev) 43 strncpy (ifr.ifr_name, dev, IFNAMSIZ); 44 45 if ((err = ioctl (fd, TUNSETIFF, (void *) &ifr)) < 0) { 46 printf ("Error calling TUNSETIFF: %s\n", strerror (errno)); 47 close (fd); 48 return err; 49 } 50 strncpy (dev, ifr.ifr_name, IFNAMSIZ); 51 return fd; 52 } 53 54 int 55 main (int argc, const char *argv[]) 56 { 57 58 int fd; 59 char namebuf[IFNAMSIZ]; 60 61 strcpy (namebuf, "pseudo-modem%d"); 62 fd = tun_alloc (namebuf); 63 if (fd == -1) 64 exit (1); 65 66 printf ("%s\n", namebuf); 67 fflush(stdout); 68 69 while (1) 70 sleep (3600); 71 72 return 0; 73 } 74