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

嵌入式Linux

开发平台:

C/C++

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