📄 ifconfig.c
字号:
/* * Copyright (C) 2003-2004 MITSUBISHI ELECTRIC CORPORATION and * RENESAS SOLUTIONS CORPORATION * All rights reserved. * * TCP/IP functions subsystem: * ifconfig function (i.e. set my IP address). * * <for Subsystem Version> */#if defined(T_KERNEL)#include <tk/tkernel.h>#elif defined(ITRON3)#include <itron.h>#include "id.h"#endif#include <sys/byte_order.h>#include <sys/cdefs.h>#include <sys/types.h>#include <sys/uio.h>#include <sys/file.h>#include <sys/filedesc.h>#include <sys/mbuf.h>#include <sys/fcntl.h>#include <sys/socket.h>#include <sys/socketvar.h>#include <sys/sockio.h>#include <sys/errno.h>#include <sys/sysproto.h>#include <net/route.h>#include <net/ethernet.h>#include <net/if.h>#include <netinet/in.h>#include <uif_ext.h>#define OLD 1/* * NOTE: change for your network environment. */#ifdef OLD#define IFRA_ADDR "10.74.1.100" /* IP address */#define BROAD_ADDR "10.74.1.255" /* Broadcast address */#define MASK_ADDR "255.255.255.0" /* Mask address */#else /* OLD */#define IF_FILE "a:\\ifcfg-sn0"#endif /* OLD */#define DEFAULT_DSTNET "0.0.0.0"#define DEFAULT_MASK "0.0.0.0"#define GATE_ADDR "10.74.1.1"#define IF_NAME "sn0"int ifconfig(void);static int set_netif(char *, unsigned long, unsigned long, unsigned long);static int up_netif(char *);extern unsigned long _inet_addr(char *);#ifdef TMPextern unsigned long htonl(unsigned long);#endifextern void *fast_memset(void *, int, size_t);#ifndef OLDextern void rt_ioctl(u_char, char *, char *, char *, int, int);extern int get_file_size(char *);#endif/* set my network interface */staticint set_netif(ifname, myaddr, broadaddr, maskaddr)char *ifname;unsigned long myaddr;unsigned long broadaddr;unsigned long maskaddr;{ int s, ret; struct ifaliasreq ifra; struct sockaddr_in *sin;#if defined(T_KERNEL) s = _unix_socket(AF_INET, SOCK_DGRAM, 0);#else s = unix_socket(AF_INET, SOCK_DGRAM, 0);#endif if (s == -1) return (s); /* * initialize interface configuration */ memset((char *)&ifra, 0, sizeof(struct ifaliasreq)); strcpy(ifra.ifra_name, ifname); sin = (struct sockaddr_in *)&ifra.ifra_addr; sin->sin_len = sizeof(struct sockaddr_in); sin->sin_family = AF_INET; sin->sin_addr.s_addr = myaddr; /* network broadcast addr */ sin = (struct sockaddr_in *)&ifra.ifra_broadaddr; sin->sin_len = sizeof(struct sockaddr_in); sin->sin_family = AF_INET; sin->sin_addr.s_addr = broadaddr; /* network mask addr */ sin = (struct sockaddr_in *)&ifra.ifra_mask; sin->sin_len = sizeof(struct sockaddr_in); sin->sin_family = AF_INET; sin->sin_addr.s_addr = maskaddr; /* set interface address */#if defined(T_KERNEL) ret = _unix_ioctl(s, SIOCAIFADDR, (VP)&ifra);#else ret = unix_ioctl(s, SIOCAIFADDR, (VP)&ifra);#endif#if defined(T_KERNEL) _unix_shutdown(s, SHUT_RDWR);#else unix_shutdown(s, SHUT_RDWR);#endif#if defined(T_KERNEL) _unix_close(s);#else unix_close(s);#endif return (ret);}/* check and up my network interface */staticint up_netif(ifname)char *ifname;{ int s, ret; struct ifreq ifr;#if defined(T_KERNEL) s = _unix_socket(AF_INET, SOCK_DGRAM, 0);#else s = unix_socket(AF_INET, SOCK_DGRAM, 0);#endif if (s == -1) return (s); /* get current interface status */ memset((char *)&ifr, 0, sizeof(struct ifreq)); strcpy(ifr.ifr_name, ifname);#if defined(T_KERNEL) ret = _unix_ioctl(s, SIOCGIFFLAGS, (VP)&ifr);#else ret = unix_ioctl(s, SIOCGIFFLAGS, (VP)&ifr);#endif if (ret == -1) {#if defined(T_KERNEL) _unix_close(s);#else unix_close(s);#endif return (ret); } /* up the interface if neccessary */ if (!(ifr.ifr_ifru.ifru_flags & (short)IFF_UP)) { /* bit on */ ifr.ifr_ifru.ifru_flags |= (IFF_UP);#if defined(T_KERNEL) ret = _unix_ioctl(s, SIOCSIFFLAGS, (VP)&ifr);#else ret = unix_ioctl(s, SIOCSIFFLAGS, (VP)&ifr);#endif if (ret == -1) {#if defined(T_KERNEL) _unix_close(s);#else unix_close(s);#endif return (ret); } }#if defined(T_KERNEL) _unix_shutdown(s, SHUT_RDWR);#else unix_shutdown(s, SHUT_RDWR);#endif#if defined(T_KERNEL) _unix_close(s);#else unix_close(s);#endif return (ret);}/* set my IP address */int ifconfig(void){ int ret; unsigned long myaddr, broadaddr, maskaddr;#ifndef OLD unsigned int fd, ifcfgFSize, rn; char *ebuf, *vbuf, *ebufi0, *ebufi1;#endif#ifdef TMP /* set local host ("lo0") interface */ myaddr = htonl( _inet_addr("127.0.0.1") ); broadaddr = htonl( _inet_addr("127.255.255.255") ); maskaddr = htonl( _inet_addr("255.0.0.0") ); ret = set_netif("lo0", myaddr, broadaddr, maskaddr); if (ret == -1) { return (-1); }#endif#ifdef OLD#ifndef TMP myaddr = htonl( _inet_addr(IFRA_ADDR) ); broadaddr = htonl( _inet_addr(BROAD_ADDR) ); maskaddr = htonl( _inet_addr(MASK_ADDR) );#else myaddr = _inet_addr(IFRA_ADDR); broadaddr = _inet_addr(BROAD_ADDR); maskaddr = _inet_addr(MASK_ADDR);#endif#else /* OLD */ if ((ifcfgFSize = get_file_size(IF_FILE)) == -1) { return -1; } if (pget_blk(&ebuf, ID_mpl1, ifcfgFSize) != E_OK ) { return -1; } /* read "ifcfg-sn0" file */ if ((fd = open(IF_FILE,(O_RDONLY|O_BINARY))) == -1) { return -1; } if ((rn = read(fd,ebuf,ifcfgFSize)) == -1) { close(fd); return -1; } if (close(fd) == -1) { return -1; } *(ebuf + rn ) = '\0'; /* set my IP address */ if ((ebufi0 = strstr(ebuf,"IPADDR=")) == NULL) { return -1; } ebufi0 += 7; if ((ebufi1 = strstr(ebufi0,"\r\n")) == NULL) { return -1; } if (pget_blk(&vbuf,ID_mpl1,ebufi1-ebufi0+1) != E_OK) { return -1; } strncpy(vbuf,ebufi0,ebufi1 - ebufi0); *(vbuf + (ebufi1 - ebufi0)) = '\0'; myaddr = _inet_addr((char *)vbuf); rel_blk(ID_mpl1,&vbuf); /* set broadcast address */ if ((ebufi0 = strstr(ebuf,"BROADCAST=")) == NULL) { return -1; } ebufi0 += 10; if ((ebufi1 = strstr(ebufi0,"\r\n")) == NULL) { return -1; } if (pget_blk(&vbuf,ID_mpl1,ebufi1-ebufi0+1) != E_OK) { return -1; } strncpy(vbuf,ebufi0,ebufi1 - ebufi0); *(vbuf + (ebufi1 - ebufi0)) = '\0'; broadaddr = _inet_addr((char *)vbuf); rel_blk(ID_mpl1,&vbuf); /* set mask address */ if ((ebufi0 = strstr(ebuf,"NETMASK=")) == NULL) { return -1; } ebufi0 += 8; if ((ebufi1 = strstr(ebufi0,"\r\n")) == NULL) { return -1; } if (pget_blk(&vbuf,ID_mpl1,ebufi1-ebufi0+1) != E_OK){ return -1; } strncpy(vbuf,ebufi0,ebufi1 - ebufi0); *(vbuf + (ebufi1 - ebufi0)) = '\0'; maskaddr = _inet_addr((char *)vbuf); rel_blk(ID_mpl1,&vbuf);#endif /* OLD */ /* set my network interface */ ret = set_netif(IF_NAME, myaddr, broadaddr, maskaddr); if (ret == -1) { return (-1); } /* check and up my network interface */ ret = up_netif(IF_NAME); if (ret == -1) { return (-1); }#ifndef OLD /* set default gateway */ rt_ioctl(RTM_ADD, DEFAULT_DSTNET, GATE_ADDR, DEFAULT_MASK, 1, RTF_UP | RTF_STATIC | RTF_GATEWAY);#endif return (0);}/* EOF */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -