File: ip_address.c

package info (click to toggle)
aggregate 1.0.2-2
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 304 kB
  • ctags: 117
  • sloc: ansic: 1,036; sh: 335; perl: 132; makefile: 83
file content (123 lines) | stat: -rw-r--r-- 3,715 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/**********************************************************************
 * ip_address.c                                              March 2001
 * Horms                                             horms@verge.net.au
 *
 * aggregate
 * CIDR network aggregation and filtering
 * Copyright (C) 1999-2002  Horms
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 * 02111-1307  USA
 *
 **********************************************************************/


#include "ip_address.h"
#include <unistd.h>
#include <ctype.h>
#include <stdio.h>


/**********************************************************************
 * ip_address_dotted_quad_to_decimal
 * Convert an IP address given as a string into decimal
 * pre: alleged_ip: string representing ip address
 * post: 0 on success, result contains value
 *       -1 on error
 **********************************************************************/

int ip_address_dotted_quad_to_decimal(
  char *alleged_ip, 
  ip_address_t *decimal_ip
){
  size_t length;
  ip_address_t octet_multipler;
  octet_t   octet_digit_multipler;
  int       current_digits;
  int       nooctet;
  octet_t   decimal_octet;
  char      *current;

  /*Get length and check it isn't too long*/
  if((length=strlen(alleged_ip))>IP_STRING_LENGTH-1){
    return(-1);
  }

  octet_multipler        =(ip_address_t)1;
  octet_digit_multipler  =  (octet_t)1;
  current_digits         =           0;
  nooctet                =           0;
  *decimal_ip            =(ip_address_t)0;
  decimal_octet          =  (octet_t)0;

  for(current=alleged_ip+length-1;current>alleged_ip-2;current--){
    if(isdigit(*current)){
      current_digits++;
      decimal_octet+=((octet_t)(*current-'0')*octet_digit_multipler);
      octet_digit_multipler*=(octet_t)10;
    }
    else if(*current=='.' || current<alleged_ip){
      if(
        current_digits==0          ||
        current_digits>3           ||
        decimal_octet>(octet_t)255 ||
        ++nooctet>4
      ){ 
        return (-1); 
      }
      *decimal_ip+=(ip_address_t)(decimal_octet*octet_multipler);
      octet_multipler<<=8;
      octet_digit_multipler=(octet_t)1;
      decimal_octet=(octet_t)0;
      current_digits=0;
    }
    else {
      return(-1);
    }
  }

  
  for(;nooctet<4;nooctet++){
    *decimal_ip<<=8;
  }

  return(0);
}


/**********************************************************************
 * ip_address_decimal_to_dotted_quad
 * Turn an IP given as a decimal to a dotted quad
 * pre: ip_address: string representing IP address
 * post: NULL if an error occurs
 *       dotted quad representation of IP address otherwise
 * Note: result is rendered into a static buffer
 **********************************************************************/

static char __ip_address_str[IP_STRING_LENGTH];

char *ip_address_decimal_to_dotted_quad(ip_address_t ip_address){
  snprintf(
    __ip_address_str,
    IP_STRING_LENGTH,
    "%d.%d.%d.%d",
    (ip_address>>24)&255,
    (ip_address>>16)&255,
    (ip_address>>8)&255,
    ip_address&255
  );

  return(__ip_address_str);
}