imapext-2007

diff src/osdep/unix/ipo_unix.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/unix/ipo_unix.c	Mon Sep 14 15:17:45 2009 +0900
     1.3 @@ -0,0 +1,181 @@
     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 old 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 tmp[MAILTMPLEN];
   1.164 +  struct hostent *he;
   1.165 +  void *ret = NIL;
   1.166 +  if (name) {			/* first lookup? */
   1.167 +				/* yes, do case-independent lookup */
   1.168 +    if ((strlen (name) < MAILTMPLEN) &&
   1.169 +	(he = gethostbyname (lcase (strcpy (tmp,name))))) {
   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 = 0;
   1.174 +      ret = he->h_addr;		/* set result to this one and only block */
   1.175 +    }
   1.176 +    else {			/* error */
   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 ret;			/* return result */
   1.184 +}

UW-IMAP'd extensions by yuuji