236
238
*** F O R S E R V E R ***
237
239
***************************************************/
239
servicesetup (server) /* listen for clients */
241
servicesetup (server, af) /* listen for clients */
242
struct sockaddr_in sin;
245
struct addrinfo hints, *res0, *res;
246
char port[NI_MAXSERV];
248
const char *cause = "unknown";
247
if (myhost () == NULL)
248
return (scmerr (-1,"Local hostname not known"));
249
if ((sp = getservbyname(server,"tcp")) == 0) {
251
memset(&hints, 0, sizeof(hints));
252
hints.ai_family = af;
253
hints.ai_socktype = SOCK_STREAM;
254
hints.ai_socktype = AI_PASSIVE;
255
error = getaddrinfo(NULL, server, &hints, &res0);
257
/* retry with precompiled knowledge */
250
258
if (strcmp(server, FILEPORT) == 0)
251
port = htons((u_short)FILEPORTNUM);
259
snprintf(port, sizeof(port), "%u", FILEPORTNUM);
252
260
else if (strcmp(server, DEBUGFPORT) == 0)
253
port = htons((u_short)DEBUGFPORTNUM);
261
snprintf(port, sizeof(port), "%u", DEBUGFPORTNUM);
255
return (scmerr (-1,"Can't find %s server description",server));
256
(void) scmerr (-1,"%s/tcp: unknown service: using port %d",
261
sock = socket (AF_INET,SOCK_STREAM,0);
263
return (scmerr (errno,"Can't create socket for connections"));
264
if (setsockopt (sock,SOL_SOCKET,SO_REUSEADDR,(char *)&one,sizeof(int)) < 0)
265
(void) scmerr (errno,"Can't set SO_REUSEADDR socket option");
266
(void) bzero ((char *)&sin,sizeof(sin));
267
sin.sin_family = AF_INET;
269
if (bind (sock,(struct sockaddr *)&sin,sizeof(sin)) < 0)
270
return (scmerr (errno,"Can't bind socket for connections"));
271
if (listen (sock,NCONNECTS) < 0)
272
return (scmerr (errno,"Can't listen on socket"));
265
error = getaddrinfo(NULL, port, &hints, &res0);
267
return (scmerr (-1, "%s: %s", server,
268
gai_strerror(error)));
270
for (res = res0; res; res = res->ai_next) {
271
sock = socket(res->ai_family, res->ai_socktype,
277
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
278
(char *)&one, sizeof(int)) < 0) {
279
cause = "setsockopt(SO_REUSEADDR)";
283
if (bind(sock, res->ai_addr, res->ai_addrlen) < 0) {
288
if (listen(sock, NCONNECTS) < 0) {
299
return (scmerr (errno, "%s", cause));
278
struct sockaddr_in from;
304
struct sockaddr_storage from;
281
307
remotename = NULL;
370
struct sockaddr_in sin, tin;
397
struct addrinfo hints, *res, *res0;
399
char port[NI_MAXSERV];
373
if ((sp = getservbyname(server,"tcp")) == 0) {
403
memset(&hints, 0, sizeof(hints));
404
hints.ai_family = PF_UNSPEC;
405
hints.ai_socktype = SOCK_STREAM;
406
error = getaddrinfo(hostname, server, &hints, &res0);
408
/* retry with precompiled knowledge */
374
409
if (strcmp(server, FILEPORT) == 0)
375
port = htons((u_short)FILEPORTNUM);
410
snprintf(port, sizeof(port), "%u", FILEPORTNUM);
376
411
else if (strcmp(server, DEBUGFPORT) == 0)
377
port = htons((u_short)DEBUGFPORTNUM);
412
snprintf(port, sizeof(port), "%u", DEBUGFPORTNUM);
379
return (scmerr (-1,"Can't find %s server description",
381
(void) scmerr (-1,"%s/tcp: unknown service: using port %d",
385
(void) bzero ((char *)&sin,sizeof(sin));
386
sin.sin_family = AF_INET;
387
sin.sin_addr.s_addr = inet_addr (hostname);
388
if (sin.sin_addr.s_addr == (u_long) INADDR_NONE) {
389
if ((h = gethostbyname (hostname)) == NULL)
390
return (scmerr (-1,"Can't find host entry for %s",
392
hostname = h->h_name;
393
(void) bcopy (h->h_addr,(char *)&sin.sin_addr,h->h_length);
416
error = getaddrinfo(hostname, port, &hints, &res0);
418
return (scmerr (-1, "%s: %s", server,
419
gai_strerror(error)));
398
netfile = socket (AF_INET,SOCK_STREAM,0);
400
return (scmerr (errno,"Can't create socket"));
402
if (connect(netfile,(struct sockaddr *)&tin,sizeof(tin)) >= 0)
404
(void) scmerr (errno,"Can't connect to server for %s",server);
405
(void) close(netfile);
406
if (!dobackoff (retry,&backoff))
424
for (res = res0; res; res = res->ai_next) {
425
if (res->ai_addrlen > sizeof(remoteaddr))
427
netfile = socket(res->ai_family, res->ai_socktype,
431
if (connect(netfile, res->ai_addr, res->ai_addrlen) < 0) {
441
if (!dobackoff (retry, &backoff)) {
409
remoteaddr = sin.sin_addr;
450
memcpy(&remoteaddr, res->ai_addr, res->ai_addrlen);
410
451
remotename = salloc(hostname);
412
453
(void) write (netfile,(char *)&x,sizeof(int));
413
454
swapmode = 0; /* swap only on server, not client */
479
522
int samehost () /* is remote host same as local host? */
481
static struct in_addr *intp;
491
struct sockaddr_in sin;
493
if ((s = socket (AF_INET,SOCK_DGRAM,0)) < 0)
494
logquit (1,"Can't create socket for SIOCGIFCONF");
495
ifc.ifc_len = sizeof(buf);
497
if (ioctl (s,SIOCGIFCONF,(char *)&ifc) < 0)
498
logquit (1,"SIOCGIFCONF failed");
500
if ((nint = ifc.ifc_len/sizeof(struct ifreq)) <= 0)
502
intp = (struct in_addr *)
503
malloc ((unsigned) nint*sizeof(struct in_addr));
504
if ((ifp = intp) == 0)
505
logquit (1,"no space for interfaces");
506
for (ifr = ifc.ifc_req, n = nint; n > 0; --n, ifr++) {
507
(void) bcopy ((char *)&ifr->ifr_addr,(char *)&sin,sizeof(sin));
508
*ifp++ = sin.sin_addr;
524
struct ifaddrs *ifap, *ifa;
525
char h1[NI_MAXHOST], h2[NI_MAXHOST];
527
#ifdef NI_WITHSCOPEID
528
const int niflags = NI_NUMERICHOST | NI_WITHSCOPEID;
530
const int niflags = NI_NUMERICHOST;
533
if (getnameinfo((struct sockaddr *)&remoteaddr, sizeof(remoteaddr),
534
h1, sizeof(h1), NULL, 0, niflags))
536
if (getifaddrs(&ifap) < 0)
538
for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
539
if (remoteaddr.ss_family != ifa->ifa_addr->sa_family)
541
if (ifa->ifa_addr->sa_family == AF_INET)
542
len = sizeof(struct sockaddr_in);
543
else if (ifa->ifa_addr->sa_family == AF_INET6)
544
len = sizeof(struct sockaddr_in6);
547
if (getnameinfo(ifa->ifa_addr, len,
548
h2, sizeof(h2), NULL, 0, niflags))
550
if (strcmp(h1, h2) == 0) {
511
if (remoteaddr.s_addr == htonl(INADDR_LOOPBACK))
513
for (ifp = intp, n = nint; n > 0; --n, ifp++)
514
if (remoteaddr.s_addr == ifp->s_addr)
519
559
int matchhost (name) /* is this name of remote host? */
525
if ((addr.s_addr = inet_addr(name)) != (u_long) INADDR_NONE)
526
return (addr.s_addr == remoteaddr.s_addr);
527
if ((h = gethostbyname (name)) == 0)
529
if (h->h_addrtype != AF_INET || h->h_length != sizeof(struct in_addr))
531
for (ap = h->h_addr_list; *ap; ap++)
532
if (bcmp ((char *)&remoteaddr,*ap,h->h_length) == 0)
562
char h1[NI_MAXHOST], h2[NI_MAXHOST];
563
#ifdef NI_WITHSCOPEID
564
const int niflags = NI_NUMERICHOST | NI_WITHSCOPEID;
566
const int niflags = NI_NUMERICHOST;
568
struct addrinfo hints, *res0, *res;
570
if (getnameinfo((struct sockaddr *)&remoteaddr, sizeof(remoteaddr),
571
h1, sizeof(h1), NULL, 0, niflags))
573
memset(&hints, 0, sizeof(hints));
574
hints.ai_family = PF_UNSPEC;
575
hints.ai_socktype = SOCK_DGRAM; /*dummy*/
576
hints.ai_flags = AI_NUMERICHOST;
577
if (getaddrinfo(name, "0", &hints, &res0) != 0)
579
for (res = res0; res; res = res->ai_next) {
580
if (remoteaddr.ss_family != res->ai_family)
582
if (getnameinfo(res->ai_addr, res->ai_addrlen,
583
h2, sizeof(h2), NULL, 0, niflags))
585
if (strcmp(h1, h2) == 0) {
538
int scmerr (int errno,char *fmt,...)
595
int scmerr (int erno,char *fmt,...)
540
597
/*VARARGS*//*ARGSUSED*/
541
598
int scmerr (va_alist)