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