C++程序  |  74行  |  1.38 KB

/*
 * 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;
}