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

嵌入式Linux

开发平台:

C/C++

  1. /*
  2.  * netifconfig.c -- look and change the interface configuration
  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. char *prgname;
  15. int getconfig(int sock, struct ifreq *req, int print)
  16. {
  17.     if ( ioctl(sock, SIOCGIFMAP, req) < 0) {
  18.         fprintf(stderr, "%s: ioctl(SIOCGIFMAP): %sn",
  19.                 prgname,strerror(errno));
  20.         return -1;
  21.     }
  22.     if (print) 
  23.         printf("%s: mem=0x%lx-0x%lx, io=0x%x, irq=%i, dma=%i, port=%in",
  24.                req->ifr_name,
  25.                (long)req->ifr_map.mem_start,
  26.                (long)req->ifr_map.mem_end,
  27.                req->ifr_map.base_addr,
  28.                req->ifr_map.irq,
  29.                req->ifr_map.dma,
  30.                req->ifr_map.port);
  31.     return 0;
  32. }
  33. int setconfig(int sock, struct ifreq *req)
  34. {
  35.     if ( ioctl(sock, SIOCSIFMAP, req) < 0) {
  36.         fprintf(stderr, " %s: ioctl(SIOCSIFMAP): %sn",
  37.                 prgname,strerror(errno));
  38.         return -1;
  39.     }
  40.     return 0;
  41. }
  42. int main(int argc, char **argv)
  43. {
  44.     int sock;
  45.     struct ifreq req;
  46.     char *action = NULL;
  47.     prgname = argv[0];
  48.     if (argc < 2) {
  49.         fprintf(stderr,"%s: usage is "%s <ifname> [<operation>]"n",
  50.                 prgname, prgname);
  51.         exit(1);
  52.     }
  53.     strcpy(req.ifr_name, argv[1]);
  54.     argc--; argv++; /* shift the interface out */
  55.     /* a silly raw socket just for ioctl()ling it */
  56.     sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
  57.     if (sock < 0) {
  58.         fprintf(stderr, "%s: socket(): %sn", argv[0],strerror(errno));
  59.         exit(1);
  60.     }
  61.     if (getconfig(sock,&req, (argc==1) )) /* print if no commands */
  62.         exit(1);
  63.     /* ok, now loop through the options */
  64.     while (argc > 1) {
  65.         char *value;
  66.         int ivalue = 0;
  67.         action = argv[1];
  68.         value = strchr(action,'=');
  69.         if (value) {
  70.             *value=0; /* terminate action */
  71.             value++; /* skip the terminator */
  72.             sscanf(value,"%i",&ivalue);
  73.             /* fprintf(stderr,"--> %s %in",action,ivalue); */
  74.         }
  75.         if (!strcmp(action,"mem_start"))
  76.             req.ifr_map.mem_start=ivalue;
  77.         else if (!strcmp(action,"mem_end"))
  78.             req.ifr_map.mem_end=ivalue;
  79.         else if (!strcmp(action,"io"))
  80.             req.ifr_map.base_addr=ivalue;
  81.         else if (!strcmp(action,"irq"))
  82.             req.ifr_map.irq=ivalue;
  83.         else if (!strcmp(action,"dma"))
  84.             req.ifr_map.dma=ivalue;
  85.         else if (!strcmp(action,"port"))
  86.             req.ifr_map.port=ivalue;
  87.         else if (!strcmp(action,"tell"))
  88.             getconfig(sock,&req, 1);
  89.         else {
  90.             fprintf(stderr,"%s: unknown argument "%s"n",
  91.                     prgname,action);
  92.             argc--; argv++; continue;
  93.         }
  94.         if (strcmp(action,"tell"))
  95.             setconfig(sock,&req);
  96.         argc--; argv++;
  97.     }
  98.     exit(0);
  99. }