Mercurial > emacs
comparison src/process.c @ 69981:9fb9e33ecf2d
(conv_lisp_to_sockaddr): Fix previous change.
| author | Richard M. Stallman <rms@gnu.org> |
|---|---|
| date | Thu, 13 Apr 2006 01:08:00 +0000 |
| parents | 2ecef706d823 |
| children | 7ebead4f6646 2d2f6f096f6e c156f6a9e7b5 |
comparison
equal
deleted
inserted
replaced
| 69980:f347a837af60 | 69981:9fb9e33ecf2d |
|---|---|
| 2320 } | 2320 } |
| 2321 return 0; | 2321 return 0; |
| 2322 } | 2322 } |
| 2323 | 2323 |
| 2324 /* Convert an address object (vector or string) to an internal sockaddr. | 2324 /* Convert an address object (vector or string) to an internal sockaddr. |
| 2325 Address format has already been validated by get_lisp_to_sockaddr_size, | 2325 |
| 2326 but just to be nice, we return without doing anything | 2326 The address format has been basically validated by |
| 2327 if FAMILY is not valid. */ | 2327 get_lisp_to_sockaddr_size, but this does not mean FAMILY is valid; |
| 2328 it could have come from user data. So if FAMILY is not valid, | |
| 2329 we return after zeroing *SA. */ | |
| 2328 | 2330 |
| 2329 static void | 2331 static void |
| 2330 conv_lisp_to_sockaddr (family, address, sa, len) | 2332 conv_lisp_to_sockaddr (family, address, sa, len) |
| 2331 int family; | 2333 int family; |
| 2332 Lisp_Object address; | 2334 Lisp_Object address; |
| 2336 register struct Lisp_Vector *p; | 2338 register struct Lisp_Vector *p; |
| 2337 register unsigned char *cp = NULL; | 2339 register unsigned char *cp = NULL; |
| 2338 register int i; | 2340 register int i; |
| 2339 | 2341 |
| 2340 bzero (sa, len); | 2342 bzero (sa, len); |
| 2341 sa->sa_family = family; | |
| 2342 | 2343 |
| 2343 if (VECTORP (address)) | 2344 if (VECTORP (address)) |
| 2344 { | 2345 { |
| 2345 p = XVECTOR (address); | 2346 p = XVECTOR (address); |
| 2346 if (family == AF_INET) | 2347 if (family == AF_INET) |
| 2348 struct sockaddr_in *sin = (struct sockaddr_in *) sa; | 2349 struct sockaddr_in *sin = (struct sockaddr_in *) sa; |
| 2349 len = sizeof (sin->sin_addr) + 1; | 2350 len = sizeof (sin->sin_addr) + 1; |
| 2350 i = XINT (p->contents[--len]); | 2351 i = XINT (p->contents[--len]); |
| 2351 sin->sin_port = htons (i); | 2352 sin->sin_port = htons (i); |
| 2352 cp = (unsigned char *)&sin->sin_addr; | 2353 cp = (unsigned char *)&sin->sin_addr; |
| 2354 sa->sa_family = family; | |
| 2353 } | 2355 } |
| 2354 #ifdef AF_INET6 | 2356 #ifdef AF_INET6 |
| 2355 else if (family == AF_INET6) | 2357 else if (family == AF_INET6) |
| 2356 { | 2358 { |
| 2357 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa; | 2359 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa; |
| 2363 if (INTEGERP (p->contents[i])) | 2365 if (INTEGERP (p->contents[i])) |
| 2364 { | 2366 { |
| 2365 int j = XFASTINT (p->contents[i]) & 0xffff; | 2367 int j = XFASTINT (p->contents[i]) & 0xffff; |
| 2366 ip6[i] = ntohs (j); | 2368 ip6[i] = ntohs (j); |
| 2367 } | 2369 } |
| 2368 return; | 2370 sa->sa_family = family; |
| 2369 } | 2371 } |
| 2370 #endif | 2372 #endif |
| 2371 return; | 2373 return; |
| 2372 } | 2374 } |
| 2373 else if (STRINGP (address)) | 2375 else if (STRINGP (address)) |
| 2377 { | 2379 { |
| 2378 struct sockaddr_un *sockun = (struct sockaddr_un *) sa; | 2380 struct sockaddr_un *sockun = (struct sockaddr_un *) sa; |
| 2379 cp = SDATA (address); | 2381 cp = SDATA (address); |
| 2380 for (i = 0; i < sizeof (sockun->sun_path) && *cp; i++) | 2382 for (i = 0; i < sizeof (sockun->sun_path) && *cp; i++) |
| 2381 sockun->sun_path[i] = *cp++; | 2383 sockun->sun_path[i] = *cp++; |
| 2384 sa->sa_family = family; | |
| 2382 } | 2385 } |
| 2383 #endif | 2386 #endif |
| 2384 return; | 2387 return; |
| 2385 } | 2388 } |
| 2386 else | 2389 else |
