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 |