comparison src/core/ngx_inet.c @ 291:117ccc7c4055

nginx-0.0.3-2004-03-16-16:35:20 import
author Igor Sysoev <igor@sysoev.ru>
date Tue, 16 Mar 2004 13:35:20 +0000
parents 87e73f067470
children 0bf903191ceb
comparison
equal deleted inserted replaced
290:87e73f067470 291:117ccc7c4055
1 1
2 #include <ngx_config.h> 2 #include <ngx_config.h>
3 #include <ngx_core.h> 3 #include <ngx_core.h>
4
5
6 ngx_inline static size_t ngx_sprint_uchar(u_char *text, u_char c, size_t len)
7 {
8 size_t n;
9 ngx_uint_t c1, c2;
10
11 n = 0;
12
13 if (len == n) {
14 return n;
15 }
16
17 c1 = c / 100;
18
19 if (c1) {
20 *text++ = (u_char) (c1 + '0');
21 n++;
22
23 if (len == n) {
24 return n;
25 }
26 }
27
28 c2 = (c % 100) / 10;
29
30 if (c1 || c2) {
31 *text++ = (u_char) (c2 + '0');
32 n++;
33
34 if (len == n) {
35 return n;
36 }
37 }
38
39 c2 = c % 10;
40
41 *text++ = (u_char) (c2 + '0');
42 n++;
43
44 return n;
45 }
4 46
5 47
6 /* AF_INET only */ 48 /* AF_INET only */
7 49
8 size_t ngx_sock_ntop(int family, struct sockaddr *addr, u_char *text, 50 size_t ngx_sock_ntop(int family, struct sockaddr *addr, u_char *text,
9 size_t len) 51 size_t len)
10 { 52 {
11 u_char *p; 53 u_char *p;
54 size_t n;
55 ngx_uint_t i;
12 struct sockaddr_in *addr_in; 56 struct sockaddr_in *addr_in;
57
58 if (len == 0) {
59 return 0;
60 }
13 61
14 if (family != AF_INET) { 62 if (family != AF_INET) {
15 return 0; 63 return 0;
16 } 64 }
17 65
18 addr_in = (struct sockaddr_in *) addr; 66 addr_in = (struct sockaddr_in *) addr;
19 p = (u_char *) &addr_in->sin_addr; 67 p = (u_char *) &addr_in->sin_addr;
20 68
69 if (len > INET_ADDRSTRLEN) {
70 len = INET_ADDRSTRLEN;
71 }
72
73 n = ngx_sprint_uchar(text, p[0], len);
74
75 i = 1;
76
77 do {
78 if (len == n) {
79 text[n - 1] = '\0';
80 return n;
81 }
82
83 text[n++] = '.';
84
85 if (len == n) {
86 text[n - 1] = '\0';
87 return n;
88 }
89
90 n += ngx_sprint_uchar(&text[n], p[i++], len - n);
91
92 } while (i < 4);
93
94 if (len == n) {
95 text[n] = '\0';
96 return n;
97 }
98
99 text[n] = '\0';
100
101 return n;
102
103 #if 0
21 return ngx_snprintf((char *) text, 104 return ngx_snprintf((char *) text,
22 len > INET_ADDRSTRLEN ? INET_ADDRSTRLEN : len, 105 len > INET_ADDRSTRLEN ? INET_ADDRSTRLEN : len,
23 "%u.%u.%u.%u", p[0], p[1], p[2], p[3]); 106 "%u.%u.%u.%u", p[0], p[1], p[2], p[3]);
107 #endif
24 } 108 }
25 109
26 110
27 size_t ngx_inet_ntop(int family, u_char *addr, u_char *text, size_t len) 111 size_t ngx_inet_ntop(int family, void *addr, u_char *text, size_t len)
28 { 112 {
113 u_char *p;
114 size_t n;
115 ngx_uint_t i;
116
117 if (len == 0) {
118 return 0;
119 }
120
29 if (family != AF_INET) { 121 if (family != AF_INET) {
30 return 0; 122 return 0;
31 } 123 }
32 124
125 p = (u_char *) addr;
126
127 if (len > INET_ADDRSTRLEN) {
128 len = INET_ADDRSTRLEN;
129 }
130
131 n = ngx_sprint_uchar(text, p[0], len);
132
133 i = 1;
134
135 do {
136 if (len == n) {
137 text[n - 1] = '\0';
138 return n;
139 }
140
141 text[n++] = '.';
142
143 if (len == n) {
144 text[n - 1] = '\0';
145 return n;
146 }
147
148 n += ngx_sprint_uchar(&text[n], p[i++], len - n);
149
150 } while (i < 4);
151
152 if (len == n) {
153 text[n] = '\0';
154 return n;
155 }
156
157 text[n] = '\0';
158
159 return n;
160
161 #if 0
33 return ngx_snprintf((char *) text, 162 return ngx_snprintf((char *) text,
34 len > INET_ADDRSTRLEN ? INET_ADDRSTRLEN : len, 163 len > INET_ADDRSTRLEN ? INET_ADDRSTRLEN : len,
35 "%u.%u.%u.%u", addr[0], addr[1], addr[2], addr[3]); 164 "%u.%u.%u.%u", p[0], p[1], p[2], p[3]);
165 #endif
36 } 166 }