LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1085|回复: 6

请帮看看这几行语法错在哪里。

[复制链接]
发表于 2004-5-16 21:02:38 | 显示全部楼层 |阅读模式
  1.       25         for ( ; ; ) {
  2.       26                 buf = Malloc(len);
  3.       27                 ifc.ifc_len = len;
  4.       28                 ifc.ifc_buf = buf;
  5.       29                 if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) {
  6.       30                         if (errno != EINVAL || lastlen != 0) {
  7.       31                                 perror("ioctl error");
  8.       32                                 exit(1);
  9.       33                         }
  10.       34                 } else {
  11.       35                         if (ifc.ifc_len == lastlen)
  12.       36                                 break;          /* success, len has not changed */
  13.       37                         lastlen = ifc.ifc_len;
  14.       38                 }
  15.       39                 len += 10 * sizeof(struct ifreq);       /* increment */
  16.       40                 free(buf);
  17.       41         }
复制代码
# gcc -c get_ifi_info.c
get_ifi_info.c: In function `get_ifi_info':
get_ifi_info.c:29: syntax error before `struct'
get_ifi_info.c: At top level:
get_ifi_info.c:34: syntax error before `else'
#

这是使用SIOCGIFCONF 的例子
/usr/src/usr.sbin/arp/arp.c:    if (ioctl(sock, SIOCGIFCONF, &ifc) < 0) {

/usr/src/usr.sbin/mrouted/mtrace.c:     if (ioctl(s, SIOCGIFCONF, (char *)&ifc) < 0) {


:help :thank
 楼主| 发表于 2004-5-16 22:30:44 | 显示全部楼层
这是全部的程序
  1.        1 /* include get_ifi_info1 */
  2.        2
  3.        3 #include        "unpifi_a.h"
  4.        4 #include <net/if_a_a.h>
  5.        5 #define IFNAMSIZ  16
  6.        6 #define SIOCGIFFLAGS    _IOWR('i', 17 ,struct ifreq)  /* get ifnet flags */
  7.        7 #define SIOCGIFCONF     _IOWR('i', 36, struct ifconf) /* get ifnet list  */
  8.        8
  9.        9 struct ifi_info *
  10.       10 get_ifi_info(int family, int doaliases)
  11.       11 {
  12.       12         struct ifi_info         *ifi, *ifihead, **ifipnext;
  13.       13         int                     sockfd, len, lastlen, flags, myflags;
  14.       14         char                    *ptr, *buf, lastname[IFNAMSIZ], *cptr;
  15.       15         struct ifconf           ifc;
  16.       16         struct ifreq            *ifr, ifrcopy;
  17.       17         struct sockaddr_in      *sinptr;
  18.       18
  19.       19         if((sockfd = socket(AF_INET, SOCK_DGRAM, 0))<0) {
  20.       20                 perror("socket error");
  21.       21                 exit(1);
  22.       22         }
  23.       23         lastlen = 0;
  24.       24         len = 100 * sizeof(struct ifreq);       /* initial buffer size guess */
  25.       25         for ( ; ; ) {
  26.       26                 buf = Malloc(len);
  27.       27                 ifc.ifc_len = len;
  28.       28                 ifc.ifc_buf = buf;
  29.       29                 if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) {
  30.       30                         if (errno != EINVAL || lastlen != 0) {
  31.       31                                 perror("ioctl error");
  32.       32                                 exit(1);
  33.       33                         }
  34.       34                 } else {
  35.       35                         if (ifc.ifc_len == lastlen)
  36.       36                                 break;          /* success, len has not changed */
  37.       37                         lastlen = ifc.ifc_len;
  38.       38                 }
  39.       39                 len += 10 * sizeof(struct ifreq);       /* increment */
  40.       40                 free(buf);
  41.       41         }
  42.       42         ifihead = NULL;
  43.       43         ifipnext = &ifihead;
  44.       44         lastname[0] = 0;
  45.       45 /* end get_ifi_info1 */
  46.       46
  47.       47 /* include get_ifi_info2 */
  48.       48         for (ptr = buf; ptr < buf + ifc.ifc_len; ) {
  49.       49                 ifr = (struct ifreq *) ptr;
  50.       50
  51.       51 #ifdef  HAVE_SOCKADDR_SA_LEN
  52.       52                 len = max(sizeof(struct sockaddr), ifr->ifr_addr.sa_len);
  53.       53 #else
  54.       54                 switch (ifr->ifr_addr.sa_family) {
  55.       55 #ifdef  IPV6
  56.       56                 case AF_INET6:
  57.       57                         len = sizeof(struct sockaddr_in6);
  58.       58                         break;
  59.       59 #endif
  60.       60                 case AF_INET:
  61.       61                 default:
  62.       62                         len = sizeof(struct sockaddr);
  63.       63                         break;
  64.       64                 }
  65.       65 #endif  /* HAVE_SOCKADDR_SA_LEN */
  66.       66                 ptr += sizeof(ifr->ifr_name)+len;       /* for next one in buffer */
  67.       67
  68.       68                 if (ifr->ifr_addr.sa_family !=family)
  69.       69                         continue;       /* ignore if not desired address family */
  70.       70
  71.       71                 myflags = 0;
  72.       72                 if ( (cptr = strchr(ifr->ifr_name, ':')) != NULL)
  73.       73                         *cptr = 0;              /* replace colon will null */
  74.       74                 if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0) {
  75.       75                         if (doaliases == 0)
  76.       76                                 continue;       /* already processed this interface */
  77.       77                         myflags = IFI_ALIAS;
  78.       78                 }
  79.       79                 memcpy(lastname, ifr->ifr_name, IFNAMSIZ);
  80.       80
  81.       81                 ifrcopy = *ifr;
  82.       82                 Ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);
  83.       83                 flags = ifrcopy.ifr_flags;
  84.       84                 if ((flags & IFF_UP) == 0)
  85.       85                         continue;       /* ignore if interface not up */
  86.       86
  87.       87                 ifi = Calloc(1, sizeof(struct ifi_info));
  88.       88                 *ifipnext = ifi;                        /* prev points to this new one */
  89.       89                 ifipnext = &ifi->ifi_next;      /* pointer to next one goes here */
  90.       90
  91.       91                 ifi->ifi_flags = flags;         /* IFF_xxx values */
  92.       92                 ifi->ifi_myflags = myflags;     /* IFI_xxx values */
  93.       93                 memcpy(ifi->ifi_name, ifr->ifr_name, IFI_NAME);
  94.       94                 ifi->ifi_name[IFI_NAME-1] = '\0';
  95.       95 /* end get_ifi_info2 */
  96.       96 /* include get_ifi_info3 */
  97.       97                 switch (ifr->ifr_addr.sa_family) {
  98.       98                 case AF_INET:
  99.       99                         sinptr = (struct sockaddr_in *) &ifr->ifr_addr;
  100.      100                         if (ifi->ifi_addr == NULL) {
  101.      101                                 ifi->ifi_addr = Calloc(1, sizeof(struct sockaddr_in));
  102.      102                                 memcpy(ifi->ifi_addr, sinptr, sizeof(struct sockaddr_in));
  103.      103
  104.      104 #ifdef  SIOCGIFBRDADDR
  105.      105                                 if (flags & IFF_BROADCAST) {
  106.      106                                         Ioctl(sockfd, SIOCGIFBRDADDR, &ifrcopy);
  107.      107                                         sinptr = (struct sockaddr_in *) &ifrcopy.ifr_broadaddr;
  108.      108                                         ifi->ifi_brdaddr = Calloc(1, sizeof(struct sockaddr_in));
  109.      109                                         memcpy(ifi->ifi_brdaddr, sinptr, sizeof(struct sockaddr_in));
  110.      110                                 }
  111.      111 #endif
  112.      112
  113.      113 #ifdef  SIOCGIFDSTADDR
  114.      114                                 if (flags & IFF_POINTOPOINT) {
  115.      115                                         Ioctl(sockfd, SIOCGIFDSTADDR, &ifrcopy);
  116.      116                                         sinptr = (struct sockaddr_in *) &ifrcopy.ifr_dstaddr;
  117.      117                                         ifi->ifi_dstaddr = Calloc(1, sizeof(struct sockaddr_in));
  118.      118                                         memcpy(ifi->ifi_dstaddr, sinptr, sizeof(struct sockaddr_in));
  119.      119                                 }
  120.      120 #endif
  121.      121                         }
  122.      122                         break;
  123.      123
  124.      124                 default:
  125.      125                         break;
  126.      126                 }
  127.      127         }
  128.      128         free(buf);
  129.      129         return(ifihead);        /* pointer to first structure in linked list */
  130.      130 }
  131.      131 /* end get_ifi_info3 */
  132.      132
  133.      133 /* include free_ifi_info */
  134.      134 void
  135.      135 free_ifi_info(struct ifi_info *ifihead)
  136.      136 {
  137.      137         struct ifi_info *ifi, *ifinext;
  138.      138
  139.      139         for (ifi = ifihead; ifi != NULL; ifi = ifinext) {
  140.      140                 if (ifi->ifi_addr != NULL)
  141.      141                         free(ifi->ifi_addr);
  142.      142                 if (ifi->ifi_brdaddr != NULL)
  143.      143                         free(ifi->ifi_brdaddr);
  144.      144                 if (ifi->ifi_dstaddr != NULL)
  145.      145                         free(ifi->ifi_dstaddr);
  146.      146                 ifinext = ifi->ifi_next;        /* can't fetch ifi_next after free() */
  147.      147                 free(ifi);                                      /* the ifi_info{} itself */
  148.      148         }
  149.      149 }
  150.      150 /* end free_ifi_info */
  151.      151
  152.      152 struct ifi_info *
  153.      153 Get_ifi_info(int family, int doaliases)
  154.      154 {
  155.      155         struct ifi_info *ifi;
  156.      156
  157.      157         if ( (ifi = get_ifi_info(family, doaliases)) == NULL) {
  158.      158                 perror("get_ifi_info error");
  159.      159                 exit(1);
  160.      160         }
  161.      161         return(ifi);
  162.      162 }
复制代码
发表于 2004-5-17 08:52:46 | 显示全部楼层
会不会是某个头文件没有include?
例如SIOCGIFCONF的定义在哪个h文件里
发表于 2004-5-17 23:18:58 | 显示全部楼层
#define SIOCGIFCONF     _IOWR('i', 36, struct ifconf)
(struct ifconf) not a variable, cann't use as an argument.
发表于 2004-5-18 10:38:18 | 显示全部楼层
最初由 romy 发表
会不会是某个头文件没有include?
例如SIOCGIFCONF的定义在哪个h文件里

同感,或者是某个头文件没找到。
 楼主| 发表于 2004-5-18 16:28:11 | 显示全部楼层
SIOCGIFCONF定义在net/if.h
上面的if_a_a.h是if.h的复制品。
发表于 2004-5-22 21:47:51 | 显示全部楼层
SIOCGIFCONF
ioctl()没有这个参数,现在怎么实现这个功能??
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表