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