0
|
1 /* mts.c - definitions for the mail transport system */
|
|
2 #ifndef lint
|
12
|
3 static char ident[] = "@(#)$Id: mts.c,v 1.3 2006/12/05 18:18:14 kono Exp $";
|
0
|
4 #endif /* lint */
|
|
5
|
|
6 /* LINTLIBRARY */
|
|
7
|
|
8 #undef NETWORK
|
|
9 #if defined(BSD41A) || defined(BSD42) || defined(SOCKETS)
|
|
10 #define NETWORK
|
|
11 #endif
|
|
12
|
|
13 #include "../h/strings.h"
|
|
14 #include <ctype.h>
|
|
15 #include <stdio.h>
|
|
16 #include "mts.h"
|
|
17 #ifdef NETWORK
|
|
18 #if defined(BSD42) || defined(SOCKETS)
|
|
19 #include <netdb.h>
|
|
20 #endif
|
|
21 #else /* NETWORK */
|
|
22 #ifndef SYS5
|
|
23 #include <whoami.h>
|
|
24 #else
|
|
25 #include <sys/utsname.h>
|
|
26 #endif /* SYS5 */
|
|
27 #endif /* NETWORK */
|
|
28 #include <pwd.h>
|
16
|
29 #include <netdb.h>
|
|
30 #include <unistd.h>
|
|
31
|
0
|
32
|
|
33
|
|
34 #define NOTOK (-1)
|
|
35 #define OK 0
|
|
36
|
|
37 #define NULLCP ((char *) 0)
|
|
38
|
|
39 #include <errno.h>
|
|
40
|
|
41 static char *tailor_value ();
|
|
42
|
|
43
|
|
44 #if defined(SYS5) && !defined(_AIX)
|
|
45 #define index strchr
|
|
46 #define rindex strrchr
|
|
47 #endif /* SYS5 */
|
|
48
|
|
49 #if !defined(__STDC__) && !defined(_AIX) && !defined(_POSIX_SOURCE)
|
|
50 char *index (), *malloc (), *mktemp (), *rindex (), *strcpy ();
|
|
51
|
|
52 #ifdef SYS5
|
|
53 struct passwd *getpwuid ();
|
|
54 #endif
|
|
55 #endif /* !__STDC__ */
|
|
56
|
|
57 /* */
|
|
58
|
|
59 /*
|
|
60 *mmdfldir and *uucpldir are the maildrop directories. If maildrops
|
|
61 are kept in the user's home directory, then these should be empty
|
|
62 strings. In this case, the appropriate ...lfil array should contain
|
|
63 the name of the file in the user's home directory. Usually, this is
|
|
64 something like ".mail".
|
|
65 */
|
|
66
|
10
|
67 static char *mtstailor = "/usr/local/lib/mh/mtstailor";
|
0
|
68
|
|
69 static char *localname = "";
|
|
70 static char *localdomain = "";
|
|
71 static char *systemname = "";
|
|
72 #ifdef MF
|
|
73 static char *UUCPchan = "";
|
|
74 #endif /* MF */
|
|
75 char *mmdfldir = "/var/mail";
|
|
76 char *mmdflfil = "";
|
|
77 #ifdef MF
|
|
78 char *uucpldir = "/usr/spool/mail";
|
|
79 #else /* MF */
|
|
80 char *uucpldir = "";
|
|
81 #endif /* MF */
|
|
82 char *uucplfil = "";
|
|
83
|
|
84
|
|
85 char *mmdlm1 = "\001\001\001\001\n";
|
|
86 char *mmdlm2 = "\001\001\001\001\n";
|
|
87
|
|
88
|
|
89 static int MMailids = 0;
|
|
90 static char *mmailid = "0";
|
|
91
|
|
92
|
|
93 #ifdef MF
|
10
|
94 char *umincproc = "/usr/local/lib/mh/uminc";
|
0
|
95 #else /* MF */
|
|
96 char *umincproc = NULL;
|
|
97 #endif /* MF */
|
|
98
|
|
99
|
|
100 int lockstyle = LOK_UNIX;
|
|
101 static char *lkstyle = "0";
|
|
102 char *lockldir = "";
|
|
103
|
|
104 /* */
|
|
105
|
|
106 /* MTS specific variables */
|
|
107
|
|
108 #ifdef MHMTS
|
|
109 char *Mailqdir = "/usr/spool/netmail";
|
|
110 char *TMailqdir = "/usr/tmp";
|
|
111 int Syscpy = 1;
|
|
112 static char *syscpy = "1";
|
|
113 char *Overseer = "root";
|
|
114 char *Mailer = "root";
|
|
115 char *Fromtmp = "/tmp/rml.f.XXXXXX";
|
|
116 char *Msgtmp = "/tmp/rml.m.XXXXXX";
|
|
117 char *Errtmp = "/tmp/rml.e.XXXXXX";
|
|
118 int Tmpmode = 0600;
|
|
119 static char *tmpmode = "0600";
|
10
|
120 char *Okhosts = "/usr/local/lib/mh/Rmail.OkHosts";
|
|
121 char *Okdests = "/usr/local/lib/mh/Rmail.OkDests";
|
0
|
122 #endif /* MHMTS */
|
|
123
|
|
124 #ifdef MMDFMTS
|
|
125 #endif /* MMDFMTS */
|
|
126
|
|
127 #ifdef SENDMTS
|
10
|
128 char *hostable = "/usr/local/lib/mh/hosts";
|
|
129 char *sendmail = "/usr/lib/sendmail";
|
0
|
130 #endif /* SENDMTS */
|
|
131
|
|
132
|
|
133 /* SMTP/POP stuff */
|
|
134
|
|
135 char *clientname = (char *)0;
|
|
136 char *servers = "localhost \01localnet";
|
|
137 char *pophost = "";
|
|
138 #ifdef MH_PLUS
|
|
139 char *rpop_default = "";
|
|
140 #endif /* MH_PLUS */
|
|
141
|
|
142
|
|
143 /* BBoards-specific variables */
|
|
144
|
|
145 char *bb_domain = "";
|
|
146
|
|
147
|
|
148 /* POP BBoards-specific variables */
|
|
149
|
|
150 #if defined(BPOP) || defined(NNTP)
|
|
151 char *popbbhost = "";
|
|
152 #endif /* BPOP || NNTP */
|
|
153 #ifdef BPOP
|
|
154 char *popbbuser = "";
|
10
|
155 char *popbblist = "/usr/local/lib/mh/hosts.popbb";
|
0
|
156 #endif /* BPOP */
|
|
157
|
|
158
|
|
159 /* MailDelivery */
|
|
160
|
10
|
161 char *maildelivery = "/usr/local/lib/mh/maildelivery";
|
0
|
162
|
|
163
|
|
164 /* Aliasing Facility (doesn't belong here) */
|
|
165
|
|
166 int Everyone = NOTOK;
|
|
167 static char *everyone = "-1";
|
|
168 char *NoShell = "";
|
|
169
|
|
170 #ifdef MH_PLUS
|
|
171 int LocalUser = 0;
|
|
172 static char *localuser = "0";
|
|
173 #endif /* MH_PLUS */
|
|
174
|
|
175 /* */
|
|
176
|
10
|
177 /* customize the MTS settings for MH by reading /usr/local/lib/mh/mtstailor */
|
0
|
178
|
|
179 static struct bind {
|
|
180 char *keyword;
|
|
181 char **value;
|
|
182 } binds[] = {
|
|
183 "localname", &localname,
|
|
184 "localdomain", &localdomain,
|
|
185 "systemname", &systemname,
|
|
186 #ifdef MF
|
|
187 "uucpchan", &UUCPchan,
|
|
188 #endif /* MF */
|
|
189 "mmdfldir", &mmdfldir,
|
|
190 "mmdflfil", &mmdflfil,
|
|
191 "uucpldir", &uucpldir,
|
|
192 "uucplfil", &uucplfil,
|
|
193 "mmdelim1", &mmdlm1,
|
|
194 "mmdelim2", &mmdlm2,
|
|
195 "mmailid", &mmailid,
|
|
196 "umincproc", &umincproc,
|
|
197 "lockstyle", &lkstyle,
|
|
198 "lockldir", &lockldir,
|
|
199
|
|
200 #ifdef MHMTS
|
|
201 "mailqdir", &Mailqdir,
|
|
202 "tmailqdir", &TMailqdir,
|
|
203 "syscpy", &syscpy,
|
|
204 "overseer", &Overseer,
|
|
205 "mailer", &Mailer,
|
|
206 "fromtmp", &Fromtmp,
|
|
207 "msgtmp", &Msgtmp,
|
|
208 "errtmp", &Errtmp,
|
|
209 "tmpmode", &tmpmode,
|
|
210 "okhosts", &Okhosts,
|
|
211 "okdests", &Okdests,
|
|
212 #endif /* MHMTS */
|
|
213
|
|
214 #ifdef MMDFMTS
|
|
215 #endif /* MMDFMTS */
|
|
216
|
|
217 #ifdef SENDMTS
|
|
218 "hostable", &hostable,
|
|
219 "sendmail", &sendmail,
|
|
220 #endif /* SENDMTS */
|
|
221
|
|
222 "clientname", &clientname,
|
|
223 "servers", &servers,
|
|
224 "pophost", &pophost,
|
|
225 #ifdef MH_PLUS
|
|
226 "rpop", &rpop_default,
|
|
227 #endif /* MH_PLUS */
|
|
228
|
|
229 "bbdomain", &bb_domain,
|
|
230
|
|
231 #ifdef BPOP
|
|
232 "popbbhost", &popbbhost,
|
|
233 "popbbuser", &popbbuser,
|
|
234 "popbblist", &popbblist,
|
|
235 #endif /* BPOP */
|
|
236 #ifdef NNTP
|
|
237 "nntphost", &popbbhost,
|
|
238 #endif /* NNTP */
|
|
239
|
|
240 "maildelivery", &maildelivery,
|
|
241
|
|
242 "everyone", &everyone,
|
|
243 "noshell", &NoShell,
|
|
244
|
|
245 #ifdef MH_PLUS
|
|
246 "localuser", &localuser,
|
|
247 #endif /* MH_PLUS */
|
|
248
|
|
249 NULL
|
|
250 };
|
|
251
|
|
252 /* */
|
|
253
|
|
254 /* I'd like to use m_getfld() here, but not all programs loading mts.o may be
|
|
255 MH-style programs... */
|
|
256
|
|
257 /* ARGSUSED */
|
|
258
|
16
|
259 void
|
0
|
260 mts_init (name)
|
|
261 char *name;
|
|
262 {
|
|
263 register char *bp,
|
|
264 *cp;
|
|
265 char buffer[BUFSIZ];
|
|
266 register struct bind *b;
|
|
267 register FILE *fp;
|
|
268 static int inited = 0;
|
|
269
|
|
270 if (inited++ || (fp = fopen (mtstailor, "r")) == NULL)
|
|
271 return;
|
|
272
|
|
273 while (fgets (buffer, sizeof buffer, fp)) {
|
|
274 if ((cp = index (buffer, '\n')) == NULL)
|
|
275 break;
|
|
276 *cp = 0;
|
|
277 if (*buffer == '#' || *buffer == '\0')
|
|
278 continue;
|
|
279 if ((bp = index (buffer, ':')) == NULL)
|
|
280 break;
|
|
281 *bp++ = 0;
|
|
282 while (isspace (*bp))
|
|
283 *bp++ = 0;
|
|
284
|
|
285 for (b = binds; b -> keyword; b++)
|
|
286 if (strcmp (buffer, b -> keyword) == 0)
|
|
287 break;
|
|
288 if (b -> keyword && (cp = tailor_value (bp)))
|
|
289 *b -> value = cp;
|
|
290 }
|
|
291
|
|
292 (void) fclose (fp);
|
|
293
|
|
294 MMailids = atoi (mmailid);
|
|
295 if ((lockstyle = atoi (lkstyle)) < LOK_UNIX || lockstyle > LOK_MMDF)
|
|
296 lockstyle = LOK_UNIX;
|
|
297 #ifdef MHMTS
|
|
298 Syscpy = atoi (syscpy);
|
|
299 (void) sscanf (tmpmode, "0%o", &Tmpmode);
|
|
300 #endif /* MHMTS */
|
|
301 Everyone = atoi (everyone);
|
|
302 #ifdef MH_PLUS
|
|
303 LocalUser = atoi (localuser);
|
|
304 #endif /* MH_PLUS */
|
|
305 }
|
|
306
|
|
307 /* */
|
|
308
|
|
309 #define QUOTE '\\'
|
|
310
|
|
311 static char *tailor_value (s)
|
|
312 register char *s;
|
|
313 {
|
|
314 register int i,
|
|
315 r;
|
|
316 register char *bp;
|
|
317 char buffer[BUFSIZ];
|
|
318
|
|
319 for (bp = buffer; *s; bp++, s++)
|
|
320 if (*s != QUOTE)
|
|
321 *bp = *s;
|
|
322 else
|
|
323 switch (*++s) {
|
|
324 #define grot(y,z) case y: *bp = z; break;
|
|
325 grot ('b', '\b');
|
|
326 grot ('f', '\f');
|
|
327 grot ('n', '\n');
|
|
328 grot ('t', '\t');
|
|
329 #undef grot
|
|
330
|
|
331 case 0: s--;
|
|
332 case QUOTE:
|
|
333 *bp = QUOTE;
|
|
334 break;
|
|
335
|
|
336 default:
|
|
337 if (!isdigit (*s)) {
|
|
338 *bp++ = QUOTE;
|
|
339 *bp = *s;
|
|
340 }
|
|
341 r = *s != '0' ? 10 : 8;
|
|
342 for (i = 0; isdigit (*s); s++)
|
|
343 i = i * r + *s - '0';
|
|
344 s--;
|
|
345 *bp = toascii (i);
|
|
346 break;
|
|
347 }
|
|
348 *bp = 0;
|
|
349
|
|
350 bp = malloc ((unsigned) (strlen (buffer) + 1));
|
|
351 if (bp != NULL)
|
|
352 (void) strcpy (bp, buffer);
|
|
353
|
|
354 return bp;
|
|
355 }
|
|
356
|
|
357 /* */
|
|
358
|
|
359 struct hostent *mh_gethostbyname();
|
|
360
|
|
361 char *LocalName () {
|
|
362 #ifdef BSD41A
|
|
363 char *myname;
|
|
364 #endif /* BSD41A */
|
|
365 #if defined(BSD42) || defined(SOCKETS)
|
|
366 register struct hostent *hp;
|
|
367 #endif /* BSD42 or SOCKETS */
|
|
368 #if defined(SYS5) && !defined(NETWORK)
|
|
369 struct utsname name;
|
|
370 #endif /* SYS5 and not NETWORK */
|
|
371 static char buffer[BUFSIZ] = "";
|
|
372
|
|
373 if (buffer[0])
|
|
374 return buffer;
|
|
375
|
|
376 mts_init ("mts");
|
|
377 if (*localname)
|
|
378 strcpy (buffer, localname);
|
|
379 else {
|
|
380
|
|
381 #ifdef locname
|
|
382 (void) strcpy (buffer, locname);
|
|
383 #else /* not locname */
|
|
384 #ifdef NETWORK
|
|
385 #ifdef BSD41A
|
|
386 myname = "myname";
|
|
387 if (rhost (&myname) == -1)
|
|
388 (void) gethostname (buffer, sizeof buffer);
|
|
389 else {
|
|
390 (void) strcpy (buffer, myname);
|
|
391 free (myname);
|
|
392 }
|
|
393 #endif /* BSD41A */
|
|
394 #if defined(BSD42) || defined(SOCKETS)
|
|
395 (void) gethostname (buffer, sizeof buffer);
|
|
396 #ifndef BIND
|
|
397 sethostent (1);
|
|
398 #endif
|
16
|
399 if ((hp = mh_gethostbyname (buffer)))
|
0
|
400 (void) strcpy (buffer, hp -> h_name);
|
|
401 #endif /* BSD42 or SOCKETS */
|
|
402 #else /* not NETWORK */
|
|
403 #ifndef SYS5
|
|
404 (void) strcpy (buffer, SystemName ());
|
|
405 #else /* SYS5 */
|
|
406 (void) uname (&name);
|
|
407 (void) strcpy (buffer, name.nodename);
|
|
408 #endif /* SYS5 */
|
|
409 #endif /* not NETWORK */
|
|
410 #endif /* not locname */
|
|
411 }
|
|
412 if (*localdomain) {
|
|
413 strcat (buffer, ".");
|
|
414 strcat (buffer, localdomain);
|
|
415 }
|
|
416 return buffer;
|
|
417 }
|
|
418
|
|
419 /* */
|
|
420
|
|
421 char *SystemName () {
|
|
422 #if defined(SYS5) && !defined(NETWORK)
|
|
423 struct utsname name;
|
|
424 #endif /* SYS5 and not NETWORK */
|
|
425 static char buffer[BUFSIZ] = "";
|
|
426
|
|
427 if (buffer[0])
|
|
428 return buffer;
|
|
429
|
|
430 mts_init ("mts");
|
|
431 if (*systemname)
|
|
432 return strcpy (buffer, systemname);
|
|
433
|
|
434 #ifdef sysname
|
|
435 (void) strcpy (buffer, sysname);
|
|
436 #else /* sysname */
|
|
437 #if !defined(SYS5) || defined(NETWORK)
|
|
438 (void) gethostname (buffer, sizeof buffer);
|
|
439 #else /* SYS5 and not NETWORK */
|
|
440 #ifdef SYS5
|
|
441 (void) uname (&name);
|
|
442 (void) strcpy (buffer, name.nodename);
|
|
443 #endif /* SYS5 */
|
|
444 #endif /* SYS5 and not NETWORK */
|
|
445 #endif /* sysname */
|
|
446
|
|
447 return buffer;
|
|
448 }
|
|
449
|
|
450 /* */
|
|
451
|
|
452 char *UucpChan () {
|
|
453 #ifdef MF
|
|
454 static char buffer[BUFSIZ] = "";
|
|
455 #endif /* MF */
|
|
456
|
|
457 #ifndef MF
|
|
458 return NULL;
|
|
459 #else /* MF */
|
|
460 if (buffer[0])
|
|
461 return buffer;
|
|
462
|
|
463 mts_init ("mts");
|
|
464 if (*UUCPchan)
|
|
465 return strcpy (buffer, UUCPchan);
|
|
466
|
|
467 #ifdef uucpchan
|
|
468 (void) strcpy (buffer, uucpchan);
|
|
469 #else /* uucpchan */
|
|
470 (void) strcpy (buffer, "uucp");
|
|
471 #endif /* uucpchan */
|
|
472 return buffer;
|
|
473 #endif /* MF */
|
|
474 }
|
|
475
|
|
476 /* */
|
|
477
|
|
478 #ifdef ALTOS
|
|
479 gethostname (name, len)
|
|
480 register char *name;
|
|
481 register int len;
|
|
482 {
|
|
483 register char *cp;
|
|
484 register FILE *fp;
|
|
485
|
|
486 if (fp = fopen ("/etc/systemid", "r")) {
|
|
487 if (fgets (name, len, fp)) {
|
|
488 if (cp = index (name, '\n'))
|
|
489 *cp = 0;
|
|
490 (void) fclose (fp);
|
|
491 return OK;
|
|
492 }
|
|
493 (void) fclose (fp);
|
|
494 }
|
|
495 (void) strncpy (name, "altos", len);
|
|
496
|
|
497 return OK;
|
|
498 }
|
|
499 #endif /* ALTOS */
|
|
500
|
|
501 /* */
|
|
502
|
|
503 static char username[BUFSIZ];
|
|
504 static char fullname[BUFSIZ];
|
|
505
|
|
506
|
|
507 char *getusr () {
|
|
508 register char *cp,
|
|
509 *np;
|
|
510 #ifdef KPOP
|
|
511 int uid;
|
|
512 #endif /* KPOP */
|
|
513 register struct passwd *pw;
|
|
514
|
|
515 if (username[0])
|
|
516 return username;
|
|
517
|
|
518 #ifndef KPOP
|
|
519 #ifdef __CYGWIN32__
|
|
520 if ((cp = getenv ("USERNAME")) != NULL
|
|
521 && (pw = getpwnam (cp)) != NULL)
|
|
522 strcpy (username, cp);
|
|
523 else if ((pw = getpwuid (getuid ())) == NULL
|
|
524 || pw -> pw_name == NULL
|
|
525 || *pw -> pw_name == '\0') {
|
|
526 #else /* __CYGWIN32__ */
|
16
|
527 if (((pw = getpwuid (getuid ())) == NULL)
|
0
|
528 || pw -> pw_name == NULL
|
|
529 || *pw -> pw_name == '\0') {
|
|
530 #endif /* __CYGWIN32__ */
|
|
531 #else /* KPOP */
|
|
532 uid = getuid ();
|
|
533 if (uid == geteuid () && (cp = getenv ("USER")) != NULL
|
|
534 && (pw = getpwnam (cp)) != NULL)
|
|
535 strcpy (username, cp);
|
|
536 else if ((pw = getpwuid (uid)) == NULL
|
|
537 || pw -> pw_name == NULL
|
|
538 || *pw -> pw_name == '\0') {
|
|
539 #endif /* KPOP */
|
|
540 (void) strcpy (username, "unknown");
|
|
541 (void) sprintf (fullname, "The Unknown User-ID (%d)", getuid ());
|
|
542 return username;
|
|
543 }
|
|
544
|
|
545 np = pw -> pw_gecos;
|
|
546 #ifndef GCOS_HACK
|
|
547 for (cp = fullname; *np && *np != (MMailids ? '<' : ','); *cp++ = *np++)
|
|
548 continue;
|
|
549 #else
|
|
550 for (cp = fullname; *np && *np != (MMailids ? '<' : ','); )
|
|
551 if (*np == '&') { /* blech! */
|
|
552 (void) strcpy(cp, pw -> pw_name);
|
|
553 *cp = toupper(*cp);
|
|
554 while (*cp)
|
|
555 cp++;
|
|
556 np++;
|
|
557 }
|
|
558 else
|
|
559 *cp++ = *np++;
|
|
560 #endif
|
|
561 *cp = '\0';
|
|
562 if (MMailids) {
|
|
563 if (*np)
|
|
564 np++;
|
|
565 for (cp = username; *np && *np != '>'; *cp++ = *np++)
|
|
566 continue;
|
|
567 *cp = '\0';
|
|
568 }
|
|
569 if (MMailids == 0 || *np == '\0')
|
|
570 (void) strcpy (username, pw -> pw_name);
|
|
571
|
|
572 if ((cp = getenv ("SIGNATURE")) && *cp) {
|
|
573 if (strlen(cp) > BUFSIZ / 4) {
|
|
574 fprintf(stderr, "SIGNATURE envariable too long\n");
|
|
575 exit(1);
|
|
576 }
|
|
577 (void) strcpy (fullname, cp);
|
|
578 }
|
|
579 if (index(fullname, '.')) { /* quote any .'s */
|
|
580 char tmp[BUFSIZ];
|
|
581 sprintf (tmp, "\"%s\"", fullname);/* should quote "'s too */
|
|
582 strcpy (fullname, tmp);
|
|
583 }
|
|
584
|
|
585 return username;
|
|
586 }
|
|
587
|
|
588
|
|
589 char *getfullname () {
|
|
590 if (username[0] == '\0')
|
|
591 (void) getusr ();
|
|
592
|
|
593 return fullname;
|
|
594 }
|
|
595
|
|
596 /* */
|
|
597
|
|
598 #ifdef SYS5
|
|
599 #ifndef notdef /* Supposedly this works, I prefer the
|
|
600 recursive solution... */
|
|
601
|
|
602 #include <fcntl.h>
|
|
603
|
|
604 int dup2 (d1, d2)
|
|
605 register int d1,
|
|
606 d2;
|
|
607 {
|
|
608 int d;
|
|
609
|
|
610 if (d1 == d2)
|
|
611 return OK;
|
|
612
|
|
613 (void) close (d2);
|
|
614 if ((d = fcntl (d1, F_DUPFD, d2)) == NOTOK)
|
|
615 return NOTOK;
|
|
616 if (d == d2)
|
|
617 return OK;
|
|
618
|
|
619 errno = 0;
|
|
620 return NOTOK;
|
|
621 }
|
|
622
|
|
623 #else /* notdef */
|
|
624 int dup2 (d1, d2)
|
|
625 register int d1,
|
|
626 d2;
|
|
627 {
|
|
628 if (d1 == d2)
|
|
629 return OK;
|
|
630
|
|
631 (void) close (d2);
|
|
632 return dup2aux (d1, d2);
|
|
633 }
|
|
634
|
|
635
|
|
636 static int dup2aux (d1, d2)
|
|
637 register int d1,
|
|
638 d2;
|
|
639 {
|
|
640 int d,
|
|
641 i,
|
|
642 eindex;
|
|
643
|
|
644 if ((d = dup (d1)) == NOTOK)
|
|
645 return NOTOK;
|
|
646 if (d == d2)
|
|
647 return OK;
|
|
648
|
|
649 i = dup2aux (d1, d2);
|
|
650 eindex = errno;
|
|
651 (void) close (d);
|
|
652 errno = eindex;
|
|
653 return i;
|
|
654 }
|
|
655 #endif /* notdef */
|
|
656 #endif /* SYS5 */
|
|
657
|
|
658 struct hostent *
|
|
659 mh_gethostbyname(name)
|
|
660 char *name;
|
|
661 {
|
|
662 struct hostent *xx;
|
|
663 #if (defined(SOLARIS) && SOLARIS < 20400) || (defined(sony_news) && defined(__svr4))
|
|
664 # if SOLARIS == 20300
|
|
665 static struct hostent hp;
|
|
666 static char buf[1000];
|
|
667 extern struct hostent *_switch_gethostbyname_r();
|
|
668
|
|
669 xx = _switch_gethostbyname_r(name, &hp, buf, sizeof(buf), &h_errno);
|
|
670 # else
|
|
671 extern struct hostent *__switch_gethostbyname();
|
|
672
|
|
673 xx = __switch_gethostbyname(name);
|
|
674 # endif /* Solaris 2.3 */
|
|
675 #else /* SOLARIS */
|
|
676
|
|
677 xx = gethostbyname(name);
|
|
678 #endif /* SOLARIS */
|
|
679
|
|
680 return xx;
|
|
681 }
|
|
682
|
|
683 #ifdef __CYGWIN32__
|
|
684 void sethostent(x)
|
|
685 int x;
|
|
686 {
|
|
687 }
|
|
688 #endif
|