1706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh/*- 2706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org> 3706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * All rights reserved. 4706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 5706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * Redistribution and use in source and binary forms, with or without 6706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * modification, are permitted provided that the following conditions 7706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * are met: 8706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 1. Redistributions of source code must retain the above copyright 9706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * notice, this list of conditions and the following disclaimer. 10706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 2. Redistributions in binary form must reproduce the above copyright 11706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * notice, this list of conditions and the following disclaimer in the 12706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * documentation and/or other materials provided with the distribution. 13706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 14706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * SUCH DAMAGE. 25706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 26706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * $FreeBSD: src/usr.sbin/ppp/iplist.c,v 1.10.26.1 2010/12/21 17:10:29 kensmith Exp $ 27706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh */ 28706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 29706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <sys/types.h> 30706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <netinet/in.h> 31706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <arpa/inet.h> 32706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 33706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <stdlib.h> 34706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <string.h> 35706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <termios.h> 36706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 37706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "log.h" 38706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "defs.h" 39706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "iplist.h" 40706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 41706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstatic int 42706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehdo_inet_aton(const char *start, const char *end, struct in_addr *ip) 43706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 44706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh char ipstr[16]; 45706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 46706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (end - start > 15) { 47706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogWARN, "%.*s: Invalid IP address\n", (int)(end-start), start); 48706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 0; 49706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 50706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh strncpy(ipstr, start, end-start); 51706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ipstr[end-start] = '\0'; 52706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return inet_aton(ipstr, ip); 53706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 54706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 55706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstatic void 56706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehiplist_first(struct iplist *list) 57706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 58706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.pos = -1; 59706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 60706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 61706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstatic int 62706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehiplist_setrange(struct iplist *list, char *range) 63706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 64706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh char *ptr, *to; 65706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 66706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if ((ptr = strpbrk(range, ",-")) == NULL) { 67706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (!inet_aton(range, &list->cur.ip)) 68706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 0; 69706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.lstart = ntohl(list->cur.ip.s_addr); 70706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.nItems = 1; 71706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } else { 72706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (!do_inet_aton(range, ptr, &list->cur.ip)) 73706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 0; 74706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (*ptr == ',') { 75706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.lstart = ntohl(list->cur.ip.s_addr); 76706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.nItems = 1; 77706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } else { 78706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct in_addr endip; 79706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 80706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh to = ptr+1; 81706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if ((ptr = strpbrk(to, ",-")) == NULL) 82706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ptr = to + strlen(to); 83706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (*to == '-') 84706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 0; 85706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (!do_inet_aton(to, ptr, &endip)) 86706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 0; 87706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.lstart = ntohl(list->cur.ip.s_addr); 88706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.nItems = ntohl(endip.s_addr) - list->cur.lstart + 1; 89706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (list->cur.nItems < 1) 90706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 0; 91706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 92706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 93706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.srcitem = 0; 94706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.srcptr = range; 95706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 1; 96706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 97706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 98706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstatic int 99706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehiplist_nextrange(struct iplist *list) 100706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 101706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh char *ptr, *to, *end; 102706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 103706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ptr = list->cur.srcptr; 104706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (ptr != NULL && (ptr = strchr(ptr, ',')) != NULL) 105706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ptr++; 106706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh else 107706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ptr = list->src; 108706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 109706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh while (*ptr != '\0' && !iplist_setrange(list, ptr)) { 110706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if ((end = strchr(ptr, ',')) == NULL) 111706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh end = ptr + strlen(ptr); 112706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (end == ptr) 113706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 0; 114706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogWARN, "%.*s: Invalid IP range (skipping)\n", 115706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh (int)(end - ptr), ptr); 116706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh to = ptr; 117706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh do 118706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *to = *end++; 119706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh while (*to++ != '\0'); 120706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (*ptr == '\0') 121706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ptr = list->src; 122706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 123706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 124706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 1; 125706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 126706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 127706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstruct in_addr 128706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehiplist_next(struct iplist *list) 129706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 130706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (list->cur.pos == -1) { 131706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.srcptr = NULL; 132706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (!iplist_nextrange(list)) { 133706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.ip.s_addr = INADDR_ANY; 134706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return list->cur.ip; 135706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 136706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } else if (++list->cur.srcitem == list->cur.nItems) { 137706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (!iplist_nextrange(list)) { 138706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.ip.s_addr = INADDR_ANY; 139706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.pos = -1; 140706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return list->cur.ip; 141706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 142706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } else 143706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.ip.s_addr = htonl(list->cur.lstart + list->cur.srcitem); 144706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.pos++; 145706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 146706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return list->cur.ip; 147706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 148706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 149706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehint 150706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehiplist_setsrc(struct iplist *list, const char *src) 151706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 152706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh strncpy(list->src, src, sizeof list->src - 1); 153706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->src[sizeof list->src - 1] = '\0'; 154706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.srcptr = list->src; 155706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh do { 156706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (iplist_nextrange(list)) 157706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->nItems += list->cur.nItems; 158706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh else 159706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 0; 160706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } while (list->cur.srcptr != list->src); 161706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 1; 162706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 163706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 164706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid 165706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehiplist_reset(struct iplist *list) 166706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 167706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->src[0] = '\0'; 168706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->nItems = 0; 169706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.pos = -1; 170706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 171706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 172706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstruct in_addr 173706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehiplist_setcurpos(struct iplist *list, long pos) 174706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 175706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (pos < 0 || (unsigned)pos >= list->nItems) { 176706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.pos = -1; 177706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.ip.s_addr = INADDR_ANY; 178706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return list->cur.ip; 179706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 180706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 181706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.srcptr = NULL; 182706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.pos = 0; 183706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh while (1) { 184706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh iplist_nextrange(list); 185706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (pos < (int)list->cur.nItems) { 186706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (pos) { 187706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.srcitem = pos; 188706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.pos += pos; 189706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.ip.s_addr = htonl(list->cur.lstart + list->cur.srcitem); 190706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 191706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh break; 192706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 193706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh pos -= list->cur.nItems; 194706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh list->cur.pos += list->cur.nItems; 195706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 196706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 197706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return list->cur.ip; 198706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 199706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 200706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstruct in_addr 201706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehiplist_setrandpos(struct iplist *list) 202706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 203706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh randinit(); 204706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return iplist_setcurpos(list, random() % list->nItems); 205706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 206706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 207706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehint 208706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehiplist_ip2pos(struct iplist *list, struct in_addr ip) 209706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 210706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct iplist_cur cur; 211706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh u_long f; 212706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int result; 213706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 214706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh result = -1; 215706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh memcpy(&cur, &list->cur, sizeof cur); 216706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 217706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh for (iplist_first(list), f = 0; f < list->nItems; f++) 218706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (iplist_next(list).s_addr == ip.s_addr) { 219706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh result = list->cur.pos; 220706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh break; 221706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 222706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 223706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh memcpy(&list->cur, &cur, sizeof list->cur); 224706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return result; 225706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 226