ifenslave.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:18k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* Mode: C;
  2.  * ifenslave.c: Configure network interfaces for parallel routing.
  3.  *
  4.  * This program controls the Linux implementation of running multiple
  5.  * network interfaces in parallel.
  6.  *
  7.  * Usage: ifenslave [-v] master-interface < slave-interface [metric <N>] > ...
  8.  *
  9.  * Author: Donald Becker <becker@cesdis.gsfc.nasa.gov>
  10.  * Copyright 1994-1996 Donald Becker
  11.  *
  12.  * This program is free software; you can redistribute it
  13.  * and/or modify it under the terms of the GNU General Public
  14.  * License as published by the Free Software Foundation.
  15.  *
  16.  * The author may be reached as becker@CESDIS.gsfc.nasa.gov, or C/O
  17.  * Center of Excellence in Space Data and Information Sciences
  18.  *    Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
  19.  *
  20.  *  Changes :
  21.  *    - 2000/10/02 Willy Tarreau <willy at meta-x.org> :
  22.  *       - few fixes. Master's MAC address is now correctly taken from
  23.  *         the first device when not previously set ;
  24.  *       - detach support : call BOND_RELEASE to detach an enslaved interface.
  25.  *       - give a mini-howto from command-line help : # ifenslave -h
  26.  *
  27.  *    - 2001/02/16 Chad N. Tindel <ctindel at ieee dot org> :
  28.  *       - Master is now brought down before setting the MAC address.  In
  29.  *         the 2.4 kernel you can't change the MAC address while the device is
  30.  *         up because you get EBUSY.  
  31.  *
  32.  *    - 2001/09/13 Takao Indoh <indou dot takao at jp dot fujitsu dot com>
  33.  *       - Added the ability to change the active interface on a mode 1 bond
  34.  *         at runtime.
  35.  *
  36.  *    - 2001/10/23 Chad N. Tindel <ctindel at ieee dot org> :
  37.  *       - No longer set the MAC address of the master.  The bond device will
  38.  *         take care of this itself
  39.  *       - Try the SIOC*** versions of the bonding ioctls before using the
  40.  *         old versions
  41.  */
  42. static char *version =
  43. "ifenslave.c:v0.07 9/9/97  Donald Becker (becker@cesdis.gsfc.nasa.gov).n"
  44. "detach support added on 2000/10/02 by Willy Tarreau (willy at meta-x.org).n"
  45. "2.4 kernel support added on 2001/02/16 by Chad N. Tindel (ctindel at ieee dot org.n";
  46. static const char *usage_msg =
  47. "Usage: ifenslave [-adfrvVh] <master-interface> < <slave-if> [metric <N>] > ...n"
  48. "       ifenslave -c master-interface slave-ifn";
  49. static const char *howto_msg =
  50. "Usage: ifenslave [-adfrvVh] <master-interface> < <slave-if> [metric <N>] > ...n"
  51. "       ifenslave -c master-interface slave-ifn"
  52. "n"
  53. "       To create a bond device, simply follow these three steps :n"
  54. "       - ensure that the required drivers are properly loaded :n"
  55. "         # modprobe bonding ; modprobe <3c59x|eepro100|pcnet32|tulip|...>n"
  56. "       - assign an IP address to the bond device :n"
  57. "         # ifconfig bond0 <addr> netmask <mask> broadcast <bcast>n"
  58. "       - attach all the interfaces you need to the bond device :n"
  59. "         # ifenslave bond0 eth0 eth1 eth2n"
  60. "         If bond0 didn't have a MAC address, it will take eth0's. Then, alln"
  61. "         interfaces attached AFTER this assignment will get the same MAC addr.n"
  62. "n"
  63. "       To detach a dead interface without setting the bond device down :n"
  64. "         # ifenslave -d bond0 eth1n"
  65. "n"
  66. "       To set the bond device down and automatically release all the slaves :n"
  67. "         # ifconfig bond0 downn"
  68. "n"
  69. "       To change active slave :n"
  70. "         # ifenslave -c bond0 eth0n"
  71. "n";
  72. #include <unistd.h>
  73. #include <stdlib.h>
  74. #include <stdio.h>
  75. #include <ctype.h>
  76. #include <string.h>
  77. #include <errno.h>
  78. #include <fcntl.h>
  79. #include <getopt.h>
  80. #include <sys/types.h>
  81. #include <sys/socket.h>
  82. #include <sys/ioctl.h>
  83. #include <linux/if.h>
  84. #include <linux/if_arp.h>
  85. #include <linux/if_ether.h>
  86. #include <linux/if_bonding.h>
  87. #include <linux/sockios.h>
  88. struct option longopts[] = {
  89.  /* { name  has_arg  *flag  val } */
  90.     {"all-interfaces", 0, 0, 'a'}, /* Show all interfaces. */
  91.     {"force",       0, 0, 'f'}, /* Force the operation. */
  92.     {"help",  0, 0, '?'}, /* Give help */
  93. {"howto",       0, 0, 'h'},     /* Give some more help */
  94.     {"receive-slave", 0, 0, 'r'}, /* Make a receive-only slave.  */
  95.     {"verbose",  0, 0, 'v'}, /* Report each action taken.  */
  96.     {"version",  0, 0, 'V'}, /* Emit version information.  */
  97.     {"detach",       0, 0, 'd'}, /* Detach a slave interface. */
  98.     {"change-active", 0, 0, 'c'}, /* Change the active slave.  */
  99.     { 0, 0, 0, 0 }
  100. };
  101. /* Command-line flags. */
  102. unsigned int
  103. opt_a = 0, /* Show-all-interfaces flag. */
  104. opt_f = 0, /* Force the operation. */
  105. opt_r = 0, /* Set up a Rx-only slave. */
  106. opt_d = 0, /* detach a slave interface. */
  107. opt_c = 0, /* change-active-slave flag. */
  108. verbose = 0, /* Verbose flag. */
  109. opt_version = 0,
  110. opt_howto = 0;
  111. int skfd = -1; /* AF_INET socket for ioctl() calls. */
  112. static void if_print(char *ifname);
  113. int
  114. main(int argc, char **argv)
  115. {
  116. struct ifreq  ifr2, if_hwaddr, if_ipaddr, if_metric, if_mtu, if_dstaddr;
  117. struct ifreq  if_netmask, if_brdaddr, if_flags;
  118. int goterr = 0;
  119. int c, errflag = 0;
  120. sa_family_t master_family;
  121. char **spp, *master_ifname, *slave_ifname;
  122. int hwaddr_notset;
  123. while ((c = getopt_long(argc, argv, "acdfrvV?h", longopts, 0)) != EOF)
  124. switch (c) {
  125. case 'a': opt_a++; break;
  126. case 'f': opt_f++; break;
  127. case 'r': opt_r++; break;
  128. case 'd': opt_d++; break;
  129. case 'c': opt_c++; break;
  130. case 'v': verbose++; break;
  131. case 'V': opt_version++; break;
  132. case 'h': opt_howto++; break;
  133. case '?': errflag++;
  134. }
  135. /* option check */
  136. if (opt_c)
  137. if(opt_a || opt_f || opt_r || opt_d || verbose || opt_version ||
  138.    opt_howto || errflag ) {
  139. fprintf(stderr, usage_msg);
  140. return 2;
  141. }
  142. if (errflag) {
  143. fprintf(stderr, usage_msg);
  144. return 2;
  145. }
  146. if (opt_howto) {
  147. fprintf(stderr, howto_msg);
  148. return 0;
  149. }
  150. if (verbose || opt_version) {
  151. printf(version);
  152. if (opt_version)
  153. exit(0);
  154. }
  155. /* Open a basic socket. */
  156. if ((skfd = socket(AF_INET, SOCK_DGRAM,0)) < 0) {
  157. perror("socket");
  158. exit(-1);
  159. }
  160. if (verbose)
  161. fprintf(stderr, "DEBUG: argc=%d, optind=%d and argv[optind] is %s.n",
  162. argc, optind, argv[optind]);
  163. /* No remaining args means show all interfaces. */
  164. if (optind == argc) {
  165. if_print((char *)NULL);
  166. (void) close(skfd);
  167. exit(0);
  168. }
  169. /* Copy the interface name. */
  170. spp = argv + optind;
  171. master_ifname = *spp++;
  172. slave_ifname = *spp++;
  173. /* Check command line. */
  174. if (opt_c) {
  175. char **tempp = spp;
  176. if ((master_ifname == NULL)||(slave_ifname == NULL)||(*tempp++ != NULL)) {
  177. fprintf(stderr, usage_msg);
  178. return 2;
  179. }
  180. }
  181. /* A single args means show the configuration for this interface. */
  182. if (slave_ifname == NULL) {
  183. if_print(master_ifname);
  184. (void) close(skfd);
  185. exit(0);
  186. }
  187. /* Get the vitals from the master interface. */
  188. {
  189. struct ifreq *ifra[7] = { &if_ipaddr, &if_mtu, &if_dstaddr,
  190.   &if_brdaddr, &if_netmask, &if_flags,
  191.   &if_hwaddr };
  192. const char *req_name[7] = {
  193. "IP address", "MTU", "destination address",
  194. "broadcast address", "netmask", "status flags",
  195. "hardware address" };
  196. const int ioctl_req_type[7] = {
  197. SIOCGIFADDR, SIOCGIFMTU, SIOCGIFDSTADDR,
  198. SIOCGIFBRDADDR, SIOCGIFNETMASK, SIOCGIFFLAGS,
  199. SIOCGIFHWADDR };
  200. int i;
  201. for (i = 0; i < 7; i++) {
  202. strncpy(ifra[i]->ifr_name, master_ifname, IFNAMSIZ);
  203. if (ioctl(skfd, ioctl_req_type[i], ifra[i]) < 0) {
  204. fprintf(stderr,
  205. "Something broke getting the master's %s: %s.n",
  206. req_name[i], strerror(errno));
  207. }
  208. }
  209. hwaddr_notset = 1; /* assume master's address not set yet */
  210. for (i = 0; hwaddr_notset && (i < 6); i++) {
  211. hwaddr_notset &= ((unsigned char *)if_hwaddr.ifr_hwaddr.sa_data)[i] == 0;
  212. }
  213. /* The family '1' is ARPHRD_ETHER for ethernet. */
  214. if (if_hwaddr.ifr_hwaddr.sa_family != 1 && !opt_f) {
  215. fprintf(stderr, "The specified master interface '%s' is not"
  216. " ethernet-like.n  This program is designed to work"
  217. " with ethernet-like network interfaces.n"
  218. " Use the '-f' option to force the operation.n",
  219. master_ifname);
  220. exit (1);
  221. }
  222. master_family = if_hwaddr.ifr_hwaddr.sa_family;
  223. if (verbose) {
  224. unsigned char *hwaddr = (unsigned char *)if_hwaddr.ifr_hwaddr.sa_data;
  225. printf("The current hardware address (SIOCGIFHWADDR) of %s is type %d  "
  226.    "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.n", master_ifname,
  227.    if_hwaddr.ifr_hwaddr.sa_family, hwaddr[0], hwaddr[1],
  228.    hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]);
  229. }
  230. }
  231. /* do this when enslaving interfaces */
  232. do {
  233. if (opt_d) {  /* detach a slave interface from the master */
  234. strncpy(if_flags.ifr_name, master_ifname, IFNAMSIZ);
  235. strncpy(if_flags.ifr_slave, slave_ifname, IFNAMSIZ);
  236. if ((ioctl(skfd, SIOCBONDRELEASE, &if_flags) < 0) &&
  237. (ioctl(skfd, BOND_RELEASE_OLD, &if_flags) < 0)) {
  238. fprintf(stderr, "SIOCBONDRELEASE: cannot detach %s from %s. errno=%s.n",
  239. slave_ifname, master_ifname, strerror(errno));
  240. }
  241. else {  /* we'll set the interface down to avoid any conflicts due to
  242.    same IP/MAC */
  243. strncpy(ifr2.ifr_name, slave_ifname, IFNAMSIZ);
  244. if (ioctl(skfd, SIOCGIFFLAGS, &ifr2) < 0) {
  245. int saved_errno = errno;
  246. fprintf(stderr, "SIOCGIFFLAGS on %s failed: %sn", slave_ifname,
  247. strerror(saved_errno));
  248. }
  249. else {
  250. ifr2.ifr_flags &= ~(IFF_UP | IFF_RUNNING);
  251. if (ioctl(skfd, SIOCSIFFLAGS, &ifr2) < 0) {
  252. int saved_errno = errno;
  253. fprintf(stderr, "Shutting down interface %s failed: %sn",
  254. slave_ifname, strerror(saved_errno));
  255. }
  256. }
  257. }
  258. }
  259. else {  /* attach a slave interface to the master */
  260. /* two possibilities :
  261.    - if hwaddr_notset, do nothing.  The bond will assign the
  262.      hwaddr from it's first slave.
  263.    - if !hwaddr_notset, assign the master's hwaddr to each slave
  264. */
  265. if (hwaddr_notset) { /* we do nothing */
  266. }
  267. else {  /* we'll assign master's hwaddr to this slave */
  268. strncpy(ifr2.ifr_name, slave_ifname, IFNAMSIZ);
  269. if (ioctl(skfd, SIOCGIFFLAGS, &ifr2) < 0) {
  270. int saved_errno = errno;
  271. fprintf(stderr, "SIOCGIFFLAGS on %s failed: %sn", slave_ifname,
  272. strerror(saved_errno));
  273. return 1;
  274. }
  275. if (ifr2.ifr_flags & IFF_UP) {
  276. ifr2.ifr_flags &= ~IFF_UP;
  277. if (ioctl(skfd, SIOCSIFFLAGS, &ifr2) < 0) {
  278. int saved_errno = errno;
  279. fprintf(stderr, "Shutting down interface %s failed: %sn",
  280. slave_ifname, strerror(saved_errno));
  281. }
  282. }
  283. strncpy(if_hwaddr.ifr_name, slave_ifname, IFNAMSIZ);
  284. if (ioctl(skfd, SIOCSIFHWADDR, &if_hwaddr) < 0) {
  285. int saved_errno = errno;
  286. fprintf(stderr, "SIOCSIFHWADDR on %s failed: %sn", if_hwaddr.ifr_name,
  287. strerror(saved_errno));
  288. if (saved_errno == EBUSY)
  289. fprintf(stderr, "  The slave device %s is busy: it must be"
  290. " idle before running this command.n", slave_ifname);
  291. else if (saved_errno == EOPNOTSUPP)
  292. fprintf(stderr, "  The slave device you specified does not support"
  293. " setting the MAC address.n  Your kernel likely does not"
  294. " support slave devices.n");
  295. else if (saved_errno == EINVAL)
  296. fprintf(stderr, "  The slave device's address type does not match"
  297. " the master's address type.n");
  298. } else {
  299. if (verbose) {
  300. unsigned char *hwaddr = if_hwaddr.ifr_hwaddr.sa_data;
  301. printf("Slave's (%s) hardware address set to "
  302.    "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.n", slave_ifname,
  303.    hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]);
  304. }
  305. }
  306. }
  307. if (*spp  &&  !strcmp(*spp, "metric")) {
  308. if (*++spp == NULL) {
  309. fprintf(stderr, usage_msg);
  310. exit(2);
  311. }
  312. if_metric.ifr_metric = atoi(*spp);
  313. strncpy(if_metric.ifr_name, slave_ifname, IFNAMSIZ);
  314. if (ioctl(skfd, SIOCSIFMETRIC, &if_metric) < 0) {
  315. fprintf(stderr, "SIOCSIFMETRIC on %s: %sn", slave_ifname,
  316. strerror(errno));
  317. goterr = 1;
  318. }
  319. spp++;
  320. }
  321. if (strncpy(if_ipaddr.ifr_name, slave_ifname, IFNAMSIZ) <= 0
  322. || ioctl(skfd, SIOCSIFADDR, &if_ipaddr) < 0) {
  323. fprintf(stderr,
  324. "Something broke setting the slave's address: %s.n",
  325. strerror(errno));
  326. } else {
  327. if (verbose) {
  328. unsigned char *ipaddr = if_ipaddr.ifr_addr.sa_data;
  329. printf("Set the slave's (%s) IP address to %d.%d.%d.%d.n",
  330.    slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
  331. }
  332. }
  333. if (strncpy(if_mtu.ifr_name, slave_ifname, IFNAMSIZ) <= 0
  334. || ioctl(skfd, SIOCSIFMTU, &if_mtu) < 0) { 
  335. fprintf(stderr, "Something broke setting the slave MTU: %s.n",
  336. strerror(errno));
  337. } else {
  338. if (verbose)
  339. printf("Set the slave's (%s) MTU to %d.n", slave_ifname, if_mtu.ifr_mtu);
  340. }
  341. if (strncpy(if_dstaddr.ifr_name, slave_ifname, IFNAMSIZ) <= 0
  342. || ioctl(skfd, SIOCSIFDSTADDR, &if_dstaddr) < 0) {
  343. fprintf(stderr, "Error setting the slave (%s) with SIOCSIFDSTADDR: %s.n",
  344. slave_ifname, strerror(errno));
  345. } else {
  346. if (verbose) {
  347. unsigned char *ipaddr = if_dstaddr.ifr_dstaddr.sa_data;
  348. printf("Set the slave's (%s) destination address to %d.%d.%d.%d.n",
  349.    slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
  350. }
  351. }
  352. if (strncpy(if_brdaddr.ifr_name, slave_ifname, IFNAMSIZ) <= 0
  353. || ioctl(skfd, SIOCSIFBRDADDR, &if_brdaddr) < 0) {
  354. fprintf(stderr,
  355. "Something broke setting the slave (%s) broadcast address: %s.n",
  356. slave_ifname, strerror(errno));
  357. } else {
  358. if (verbose) {
  359. unsigned char *ipaddr = if_brdaddr.ifr_broadaddr.sa_data;
  360. printf("Set the slave's (%s) broadcast address to %d.%d.%d.%d.n",
  361.    slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
  362. }
  363. }
  364. if (strncpy(if_netmask.ifr_name, slave_ifname, IFNAMSIZ) <= 0
  365. || ioctl(skfd, SIOCSIFNETMASK, &if_netmask) < 0) {
  366. fprintf(stderr,
  367. "Something broke setting the slave (%s) netmask: %s.n",
  368. slave_ifname, strerror(errno));
  369. } else {
  370. if (verbose) {
  371. unsigned char *ipaddr = if_netmask.ifr_netmask.sa_data;
  372. printf("Set the slave's (%s) netmask to %d.%d.%d.%d.n",
  373.    slave_ifname, ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
  374. }
  375. }
  376. ifr2.ifr_flags |= IFF_UP; /* the interface will need to be up to be bonded */
  377. if ((ifr2.ifr_flags &= ~(IFF_SLAVE | IFF_MASTER)) == 0
  378. || strncpy(ifr2.ifr_name, slave_ifname, IFNAMSIZ) <= 0
  379. || ioctl(skfd, SIOCSIFFLAGS, &ifr2) < 0) {
  380. fprintf(stderr,
  381. "Something broke setting the slave (%s) flags: %s.n",
  382. slave_ifname, strerror(errno));
  383. } else {
  384. if (verbose)
  385. printf("Set the slave's (%s) flags %4.4x.n", slave_ifname, if_flags.ifr_flags);
  386. }
  387. /* Do the real thing */
  388. if ( ! opt_r) {
  389. strncpy(if_flags.ifr_name, master_ifname, IFNAMSIZ);
  390. strncpy(if_flags.ifr_slave, slave_ifname, IFNAMSIZ);
  391. if (!opt_c) {
  392. if ((ioctl(skfd, SIOCBONDENSLAVE, &if_flags) < 0) &&
  393.     (ioctl(skfd, BOND_ENSLAVE_OLD, &if_flags) < 0)) {
  394. fprintf(stderr, "SIOCBONDENSLAVE: %s.n", strerror(errno));
  395. }
  396. }
  397. else {
  398. if ((ioctl(skfd, SIOCBONDCHANGEACTIVE, &if_flags) < 0) &&
  399.     (ioctl(skfd, BOND_CHANGE_ACTIVE_OLD, &if_flags) < 0)) {
  400. fprintf(stderr, "SIOCBONDCHANGEACTIVE: %s.n", strerror(errno));
  401. }
  402. }
  403. }
  404. }
  405. } while ( (slave_ifname = *spp++) != NULL);
  406. /* Close the socket. */
  407. (void) close(skfd);
  408. return(goterr);
  409. }
  410. static short mif_flags;
  411. /* Get the inteface configuration from the kernel. */
  412. static int if_getconfig(char *ifname)
  413. {
  414. struct ifreq ifr;
  415. int metric, mtu; /* Parameters of the master interface. */
  416. struct sockaddr dstaddr, broadaddr, netmask;
  417. strcpy(ifr.ifr_name, ifname);
  418. if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0)
  419. return -1;
  420. mif_flags = ifr.ifr_flags;
  421. printf("The result of SIOCGIFFLAGS on %s is %x.n",
  422.    ifname, ifr.ifr_flags);
  423. strcpy(ifr.ifr_name, ifname);
  424. if (ioctl(skfd, SIOCGIFADDR, &ifr) < 0)
  425. return -1;
  426. printf("The result of SIOCGIFADDR is %2.2x.%2.2x.%2.2x.%2.2x.n",
  427.    ifr.ifr_addr.sa_data[0], ifr.ifr_addr.sa_data[1],
  428.    ifr.ifr_addr.sa_data[2], ifr.ifr_addr.sa_data[3]);
  429. strcpy(ifr.ifr_name, ifname);
  430. if (ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0)
  431. return -1;
  432. {
  433. /* Gotta convert from 'char' to unsigned for printf().  */
  434. unsigned char *hwaddr = (unsigned char *)ifr.ifr_hwaddr.sa_data;
  435. printf("The result of SIOCGIFHWADDR is type %d  "
  436.    "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x.n",
  437.    ifr.ifr_hwaddr.sa_family, hwaddr[0], hwaddr[1],
  438.    hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]);
  439. }
  440. strcpy(ifr.ifr_name, ifname);
  441. if (ioctl(skfd, SIOCGIFMETRIC, &ifr) < 0) {
  442. metric = 0;
  443. } else
  444. metric = ifr.ifr_metric;
  445. strcpy(ifr.ifr_name, ifname);
  446. if (ioctl(skfd, SIOCGIFMTU, &ifr) < 0)
  447. mtu = 0;
  448. else
  449. mtu = ifr.ifr_mtu;
  450. strcpy(ifr.ifr_name, ifname);
  451. if (ioctl(skfd, SIOCGIFDSTADDR, &ifr) < 0) {
  452. memset(&dstaddr, 0, sizeof(struct sockaddr));
  453. } else
  454. dstaddr = ifr.ifr_dstaddr;
  455. strcpy(ifr.ifr_name, ifname);
  456. if (ioctl(skfd, SIOCGIFBRDADDR, &ifr) < 0) {
  457. memset(&broadaddr, 0, sizeof(struct sockaddr));
  458. } else
  459. broadaddr = ifr.ifr_broadaddr;
  460. strcpy(ifr.ifr_name, ifname);
  461. if (ioctl(skfd, SIOCGIFNETMASK, &ifr) < 0) {
  462. memset(&netmask, 0, sizeof(struct sockaddr));
  463. } else
  464. netmask = ifr.ifr_netmask;
  465. return(0);
  466. }
  467. static void if_print(char *ifname)
  468. {
  469. char buff[1024];
  470. struct ifconf ifc;
  471. struct ifreq *ifr;
  472. int i;
  473. if (ifname == (char *)NULL) {
  474. ifc.ifc_len = sizeof(buff);
  475. ifc.ifc_buf = buff;
  476. if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) {
  477. fprintf(stderr, "SIOCGIFCONF: %sn", strerror(errno));
  478. return;
  479. }
  480. ifr = ifc.ifc_req;
  481. for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; ifr++) {
  482. if (if_getconfig(ifr->ifr_name) < 0) {
  483. fprintf(stderr, "%s: unknown interface.n",
  484. ifr->ifr_name);
  485. continue;
  486. }
  487. if (((mif_flags & IFF_UP) == 0) && !opt_a) continue;
  488. /*ife_print(&ife);*/
  489. }
  490. } else {
  491. if (if_getconfig(ifname) < 0)
  492. fprintf(stderr, "%s: unknown interface.n", ifname);
  493. }
  494. }
  495. /*
  496.  * Local variables:
  497.  *  version-control: t
  498.  *  kept-new-versions: 5
  499.  *  c-indent-level: 4
  500.  *  c-basic-offset: 4
  501.  *  tab-width: 4
  502.  *  compile-command: "gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux/include ifenslave.c -o ifenslave"
  503.  * End:
  504.  */