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

嵌入式Linux

开发平台:

C/C++

  1. /*
  2.  * netifconfig.c -- look and change the interface configuration
  3.  *
  4.  * Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet
  5.  * Copyright (C) 2001 O'Reilly & Associates
  6.  *
  7.  * The source code in this file can be freely used, adapted,
  8.  * and redistributed in source or binary form, so long as an
  9.  * acknowledgment appears in derived source files.  The citation
  10.  * should list that the code comes from the book "Linux Device
  11.  * Drivers" by Alessandro Rubini and Jonathan Corbet, published
  12.  * by O'Reilly & Associates.   No warranty is attached;
  13.  * we cannot take responsibility for errors or fitness for use.
  14.  */
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <unistd.h>
  18. #include <string.h>
  19. #include <errno.h>
  20. #include <sys/types.h>
  21. #include <sys/socket.h>
  22. #include <sys/ioctl.h>
  23. #include <net/if.h>
  24. #include <netinet/in.h>
  25. char *prgname;
  26. int getconfig(int sock, struct ifreq *req, int print)
  27. {
  28.     if ( ioctl(sock, SIOCGIFMAP, req) < 0) {
  29.         fprintf(stderr, "%s: ioctl(SIOCGIFMAP): %sn",
  30.                 prgname,strerror(errno));
  31.         return -1;
  32.     }
  33.     if (print) 
  34.         printf("%s: mem=0x%lx-0x%lx, io=0x%x, irq=%i, dma=%i, port=%in",
  35.                req->ifr_name,
  36.                (long)req->ifr_map.mem_start,
  37.                (long)req->ifr_map.mem_end,
  38.                req->ifr_map.base_addr,
  39.                req->ifr_map.irq,
  40.                req->ifr_map.dma,
  41.                req->ifr_map.port);
  42.     return 0;
  43. }
  44. int setconfig(int sock, struct ifreq *req)
  45. {
  46.     if ( ioctl(sock, SIOCSIFMAP, req) < 0) {
  47.         fprintf(stderr, " %s: ioctl(SIOCSIFMAP): %sn",
  48.                 prgname,strerror(errno));
  49.         return -1;
  50.     }
  51.     return 0;
  52. }
  53. int main(int argc, char **argv)
  54. {
  55.     int sock;
  56.     struct ifreq req;
  57.     char *action = NULL;
  58.     prgname = argv[0];
  59.     if (argc < 2) {
  60.         fprintf(stderr,"%s: usage is "%s <ifname> [<operation>]"n",
  61.                 prgname, prgname);
  62.         exit(1);
  63.     }
  64.     strcpy(req.ifr_name, argv[1]);
  65.     argc--; argv++; /* shift the interface out */
  66.     /* a silly raw socket just for ioctl()ling it */
  67.     sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
  68.     if (sock < 0) {
  69.         fprintf(stderr, "%s: socket(): %sn", argv[0],strerror(errno));
  70.         exit(1);
  71.     }
  72.     if (getconfig(sock,&req, (argc==1) )) /* print if no commands */
  73.         exit(1);
  74.     /* ok, now loop through the options */
  75.     while (argc > 1) {
  76.         char *value;
  77.         int ivalue = 0;
  78.         action = argv[1];
  79.         value = strchr(action,'=');
  80.         if (value) {
  81.             *value=0; /* terminate action */
  82.             value++; /* skip the terminator */
  83.             sscanf(value,"%i",&ivalue);
  84.             /* fprintf(stderr,"--> %s %in",action,ivalue); */
  85.         }
  86.         if (!strcmp(action,"mem_start"))
  87.             req.ifr_map.mem_start=ivalue;
  88.         else if (!strcmp(action,"mem_end"))
  89.             req.ifr_map.mem_end=ivalue;
  90.         else if (!strcmp(action,"io"))
  91.             req.ifr_map.base_addr=ivalue;
  92.         else if (!strcmp(action,"irq"))
  93.             req.ifr_map.irq=ivalue;
  94.         else if (!strcmp(action,"dma"))
  95.             req.ifr_map.dma=ivalue;
  96.         else if (!strcmp(action,"port"))
  97.             req.ifr_map.port=ivalue;
  98.         else if (!strcmp(action,"tell"))
  99.             getconfig(sock,&req, 1);
  100.         else {
  101.             fprintf(stderr,"%s: unknown argument "%s"n",
  102.                     prgname,action);
  103.             argc--; argv++; continue;
  104.         }
  105.         if (strcmp(action,"tell"))
  106.             setconfig(sock,&req);
  107.         argc--; argv++;
  108.     }
  109.     exit(0);
  110. }