imapext-2007
diff src/osdep/nt/ip4_nt.c @ 0:ada5e610ab86
imap-2007e
author | yuuji@gentei.org |
---|---|
date | Mon, 14 Sep 2009 15:17:45 +0900 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/osdep/nt/ip4_nt.c Mon Sep 14 15:17:45 2009 +0900 1.3 @@ -0,0 +1,184 @@ 1.4 +/* ======================================================================== 1.5 + * Copyright 1988-2006 University of Washington 1.6 + * 1.7 + * Licensed under the Apache License, Version 2.0 (the "License"); 1.8 + * you may not use this file except in compliance with the License. 1.9 + * You may obtain a copy of the License at 1.10 + * 1.11 + * http://www.apache.org/licenses/LICENSE-2.0 1.12 + * 1.13 + * 1.14 + * ======================================================================== 1.15 + */ 1.16 + 1.17 +/* 1.18 + * Program: UNIX IPv4 routines 1.19 + * 1.20 + * Author: Mark Crispin 1.21 + * Networks and Distributed Computing 1.22 + * Computing & Communications 1.23 + * University of Washington 1.24 + * Administration Building, AG-44 1.25 + * Seattle, WA 98195 1.26 + * Internet: MRC@CAC.Washington.EDU 1.27 + * 1.28 + * Date: 18 December 2003 1.29 + * Last Edited: 30 August 2006 1.30 + */ 1.31 + 1.32 +#define SADRLEN sizeof (struct sockaddr) 1.33 + 1.34 +#define SADR4(sadr) ((struct sockaddr_in *) sadr) 1.35 +#define SADR4LEN sizeof (struct sockaddr_in) 1.36 +#define SADR4ADR(sadr) SADR4 (sadr)->sin_addr 1.37 +#define ADR4LEN sizeof (struct in_addr) 1.38 +#define SADR4PORT(sadr) SADR4 (sadr)->sin_port 1.39 + 1.40 + 1.41 +/* IP abstraction layer */ 1.42 + 1.43 +char *ip_sockaddrtostring (struct sockaddr *sadr); 1.44 +long ip_sockaddrtoport (struct sockaddr *sadr); 1.45 +void *ip_stringtoaddr (char *text,size_t *len,int *family); 1.46 +struct sockaddr *ip_newsockaddr (size_t *len); 1.47 +struct sockaddr *ip_sockaddr (int family,void *adr,size_t adrlen, 1.48 + unsigned short port,size_t *len); 1.49 +char *ip_sockaddrtoname (struct sockaddr *sadr); 1.50 +void *ip_nametoaddr (char *name,size_t *len,int *family,char **canonical, 1.51 + void **next); 1.52 + 1.53 +/* Return IP address string from socket address 1.54 + * Accepts: socket address 1.55 + * Returns: IP address as name string 1.56 + */ 1.57 + 1.58 +char *ip_sockaddrtostring (struct sockaddr *sadr) 1.59 +{ 1.60 + return (sadr->sa_family == PF_INET) ? 1.61 + inet_ntoa (SADR4ADR (sadr)) : "NON-IPv4"; 1.62 +} 1.63 + 1.64 + 1.65 +/* Return port from socket address 1.66 + * Accepts: socket address 1.67 + * Returns: port number or -1 if can't determine it 1.68 + */ 1.69 + 1.70 +long ip_sockaddrtoport (struct sockaddr *sadr) 1.71 +{ 1.72 + return (sadr->sa_family == PF_INET) ? ntohs (SADR4PORT (sadr)) : -1; 1.73 +} 1.74 + 1.75 + 1.76 +/* Return IP address from string 1.77 + * Accepts: name string 1.78 + * pointer to returned length 1.79 + * pointer to returned address family 1.80 + * Returns: address if valid, length and family updated, or NIL 1.81 + */ 1.82 + 1.83 +void *ip_stringtoaddr (char *text,size_t *len,int *family) 1.84 +{ 1.85 + unsigned long adr; 1.86 + struct in_addr *ret; 1.87 + /* get address */ 1.88 + if ((adr = inet_addr (text)) == -1) ret = NIL; 1.89 + else { /* make in_addr */ 1.90 + ret = (struct in_addr *) fs_get (*len = ADR4LEN); 1.91 + *family = AF_INET; /* IPv4 */ 1.92 + ret->s_addr = adr; /* set address */ 1.93 + } 1.94 + return (void *) ret; 1.95 +} 1.96 + 1.97 +/* Create a maximum-size socket address 1.98 + * Accepts: pointer to return maximum socket address length 1.99 + * Returns: new, empty socket address of maximum size 1.100 + */ 1.101 + 1.102 +struct sockaddr *ip_newsockaddr (size_t *len) 1.103 +{ 1.104 + return (struct sockaddr *) memset (fs_get (SADRLEN),0,*len = SADRLEN); 1.105 +} 1.106 + 1.107 + 1.108 +/* Stuff a socket address 1.109 + * Accepts: address family 1.110 + * IPv4 address 1.111 + * length of address (always 4 in IPv4) 1.112 + * port number 1.113 + * pointer to return socket address length 1.114 + * Returns: socket address or NIL if error 1.115 + */ 1.116 + 1.117 +struct sockaddr *ip_sockaddr (int family,void *adr,size_t adrlen, 1.118 + unsigned short port,size_t *len) 1.119 +{ 1.120 + struct sockaddr *sadr = ip_newsockaddr (len); 1.121 + switch (family) { /* build socket address based upon family */ 1.122 + case AF_INET: /* IPv4 */ 1.123 + sadr->sa_family = PF_INET; 1.124 + /* copy host address */ 1.125 + memcpy (&SADR4ADR (sadr),adr,adrlen); 1.126 + /* copy port number in network format */ 1.127 + SADR4PORT (sadr) = htons (port); 1.128 + *len = SADR4LEN; 1.129 + break; 1.130 + default: /* non-IP?? */ 1.131 + sadr->sa_family = PF_UNSPEC; 1.132 + break; 1.133 + } 1.134 + return sadr; 1.135 +} 1.136 + 1.137 +/* Return name from socket address 1.138 + * Accepts: socket address 1.139 + * Returns: canonical name for that address or NIL if none 1.140 + */ 1.141 + 1.142 +char *ip_sockaddrtoname (struct sockaddr *sadr) 1.143 +{ 1.144 + struct hostent *he; 1.145 + return ((sadr->sa_family == PF_INET) && 1.146 + (he = gethostbyaddr ((char *) &SADR4ADR (sadr),ADR4LEN,AF_INET))) ? 1.147 + (char *) he->h_name : NIL; 1.148 +} 1.149 + 1.150 + 1.151 +/* Return address from name 1.152 + * Accepts: name or NIL to return next address 1.153 + * pointer to previous/returned length 1.154 + * pointer to previous/returned address family 1.155 + * pointer to previous/returned canonical name 1.156 + * pointer to previous/return state for next-address calls 1.157 + * Returns: address with length/family/canonical updated if needed, or NIL 1.158 + */ 1.159 + 1.160 +void *ip_nametoaddr (char *name,size_t *len,int *family,char **canonical, 1.161 + void **next) 1.162 +{ 1.163 + char **adl,tmp[MAILTMPLEN]; 1.164 + struct hostent *he; 1.165 + if (name) { /* first lookup? */ 1.166 + /* yes, do case-independent lookup */ 1.167 + if ((strlen (name) < MAILTMPLEN) && 1.168 + (he = gethostbyname (lcase (strcpy (tmp,name))))) { 1.169 + adl = he->h_addr_list; 1.170 + if (len) *len = he->h_length; 1.171 + if (family) *family = he->h_addrtype; 1.172 + if (canonical) *canonical = (char *) he->h_name; 1.173 + if (next) *next = (void *) adl; 1.174 + } 1.175 + else { /* error */ 1.176 + adl = NIL; 1.177 + if (len) *len = 0; 1.178 + if (family) *family = 0; 1.179 + if (canonical) *canonical = NIL; 1.180 + if (next) *next = NIL; 1.181 + } 1.182 + } 1.183 + /* return next in series */ 1.184 + else if (next && (adl = (char **) *next)) *next = ++adl; 1.185 + else adl = NIL; /* failure */ 1.186 + return adl ? (void *) *adl : NIL; 1.187 +}