netifdebug.c
上传用户:wudi5211
上传日期:2010-01-21
资源大小:607k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

C/C++

  1. /*
  2.  * netifdebug.c -- change the IFF_DEBUG flag of an interface
  3.  *
  4.  * Tested with 1.2 on the x86
  5.  * Tested with 2.0 on the x86, Sparc and Alpha
  6.  */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <unistd.h>
  10. #include <string.h>
  11. #include <errno.h>
  12. #include <sys/types.h>
  13. #include <sys/socket.h>
  14. #include <sys/ioctl.h>
  15. #include <net/if.h>
  16. #include <netinet/in.h>
  17. int main(int argc, char **argv)
  18. {
  19.     int action = -1, sock;
  20.     struct ifreq req;
  21.     char *actname;
  22.     if (argc < 2) {
  23.         fprintf(stderr,"%s: usage is "%s <ifname> [<on|off|tell>]"n",
  24.                 argv[0],argv[0]);
  25.         exit(1);
  26.     }
  27.     if (argc==2)
  28.         actname="tell";
  29.     else
  30.         actname=argv[2];
  31.     /* a silly raw socket just for ioctl()ling it */
  32.     sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
  33.     if (sock < 0) {
  34.         fprintf(stderr, "%s: socket(): %sn", argv[0],strerror(errno));
  35.         exit(1);
  36.     }
  37.     /* retrieve flags */
  38.     strcpy(req.ifr_name, argv[1]);
  39.     if ( ioctl(sock, SIOCGIFFLAGS, &req) < 0) {
  40.         fprintf(stderr, " %s: ioctl(SIOCGIFFLAGS): %sn",
  41.                 argv[0],strerror(errno));
  42.         exit(1);
  43.     }
  44.     if (!strcmp(actname,"on")
  45.         || !strcmp(actname,"+")
  46.         || !strcmp(actname,"1"))
  47.         action = IFF_DEBUG;
  48.     if (!strcmp(actname,"off")
  49.         || !strcmp(actname,"-")
  50.         || !strcmp(actname,"0"))
  51.         action = 0;
  52.     if (!strcmp(actname,"tell")
  53.         || actname[0]=='t') {
  54.         printf("%s: debug is %sn", argv[1],
  55.                req.ifr_flags & IFF_DEBUG ? "on" : "off");
  56.         exit(0);
  57.     }
  58.     req.ifr_flags &= ~IFF_DEBUG;
  59.     req.ifr_flags |= action;
  60.     if ( ioctl(sock, SIOCSIFFLAGS, &req) < 0) {
  61.         fprintf(stderr, " %s: ioctl(SIOCSIFFLAGS): %sn",
  62.                 argv[0],strerror(errno));
  63.         exit(1);
  64.     }
  65.     exit(0);
  66. }