tinyos-2.x.rar

源代码在线查看: device-common.c

软件大小: 21877 K
上传用户: Whibsvvy
关键词: tinyos
下载地址: 免注册下载 普通下载 VIP

相关代码

				/*
				 *   $Id: device-common.c,v 1.3 2009/08/20 17:03:05 sdhsdh Exp $
				 *
				 *   Authors:
				 *    Lars Fenneberg			 
				 *
				 *   This software is Copyright 1996,1997 by the above mentioned author(s), 
				 *   All Rights Reserved.
				 *
				 *   The license which is distributed with this software in the file COPYRIGHT
				 *   applies to this software. If your distribution is missing this file, you
				 *   may request it from .
				 *
				 */
				
				#include "config.h"
				#include "includes.h"
				#include "radvd.h"
				#include "defaults.h"
				
				int
				check_device(int sock, struct Interface *iface)
				{
					struct ifreq	ifr;
					
					strncpy(ifr.ifr_name, iface->Name, IFNAMSIZ-1);
					ifr.ifr_name[IFNAMSIZ-1] = '\0';
				
					if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0)
					{
						if (!iface->IgnoreIfMissing)
							flog(LOG_ERR, "ioctl(SIOCGIFFLAGS) failed for %s: %s", 
								iface->Name, strerror(errno));
						return (-1);
					}
				
					if (!(ifr.ifr_flags & IFF_UP))
					{
						if (!iface->IgnoreIfMissing)
				                	flog(LOG_ERR, "interface %s is not UP", iface->Name);
						return (-1);
					}
					
					if (! iface->UnicastOnly && !(ifr.ifr_flags & IFF_MULTICAST))
					{
						flog(LOG_WARNING, "interface %s does not support multicast",
							iface->Name);
						flog(LOG_WARNING, "   do you need to add the UnicastOnly flag?");
					}
				
				#if 0
				        /* SDH : ignore these warnings...  */
					if (! iface->UnicastOnly && !(ifr.ifr_flags & IFF_BROADCAST))
					{
						flog(LOG_WARNING, "interface %s does not support broadcast",
							iface->Name);
						flog(LOG_WARNING, "   do you need to add the UnicastOnly flag?");
					}
				#endif
				
					return 0;
				}
				
				int
				get_v4addr(const char *ifn, unsigned int *dst)
				{
				        struct ifreq    ifr;
				        struct sockaddr_in *addr;
				        int fd;
				
				        if( ( fd = socket(AF_INET,SOCK_DGRAM,0) ) < 0 )
				        {
				                flog(LOG_ERR, "create socket for IPv4 ioctl failed for %s: %s",
				                        ifn, strerror(errno));
				                return (-1);
				        }
				
				        memset(&ifr, 0, sizeof(ifr));
				        strncpy(ifr.ifr_name, ifn, IFNAMSIZ-1);
				        ifr.ifr_name[IFNAMSIZ-1] = '\0';
				        ifr.ifr_addr.sa_family = AF_INET;
				
				        if (ioctl(fd, SIOCGIFADDR, &ifr) < 0)
				        {
				                flog(LOG_ERR, "ioctl(SIOCGIFADDR) failed for %s: %s",
				                        ifn, strerror(errno));
				                close( fd );
				                return (-1);
				        }
				
				        addr = (struct sockaddr_in *)(&ifr.ifr_addr);
				
				        dlog(LOG_DEBUG, 3, "IPv4 address for %s is %s", ifn,
				                inet_ntoa( addr->sin_addr ) );
				
				        *dst = addr->sin_addr.s_addr;
				
				        close( fd );
				
				        return 0;
				}
							

相关资源