1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
28 /* All Rights Reserved */
29
30 #include "libmail.h"
31 #include <sys/types.h>
32 #include <ctype.h>
33 #ifdef SVR4
34 #include <sys/utsname.h>
35 #include <sys/systeminfo.h>
36 #endif
37
38 #define NMLN 512
39 #ifdef SVR4
40 #if SYS_NMLN > NMLN
41 #undef NMLN
42 #define NMLN SYS_NMLN
43 #endif
44 #endif
45
46 static char *look4domain(char *, char *, int);
47 static char *readdomain(char *, int);
48
49 /*
50 * NAME
51 * maildomain() - retrieve the domain name
52 *
53 * SYNOPSIS
54 * char *maildomain()
55 *
56 * DESCRIPTION
57 * Retrieve the domain name from xgetenv("DOMAIN").
58 * If that is not set, look in /etc/resolv.conf, /etc/inet/named.boot
59 * and /etc/named.boot for "^domain[ ]+<domain>".
60 * If that is not set, use sysinfo(SI_SRPC_DOMAIN) from
61 * -lnsl. Otherwise, return an empty string.
62 */
63
64 /* read a file for the domain */
look4domain(char * file,char * buf,int size)65 static char *look4domain(char *file, char *buf, int size)
66 {
67 char *ret = 0;
68 FILE *fp = fopen(file, "r");
69
70 if (!fp)
71 return (0);
72
73 while (fgets(buf, size, fp))
74 if (strncmp(buf, "domain", 6) == 0)
75 if (isspace(buf[6])) {
76 char *x = skipspace(buf + 6);
77 if (isgraph(*x)) {
78 trimnl(x);
79 strmove(buf, x);
80 ret = buf;
81 break;
82 }
83 }
84
85 (void) fclose(fp);
86 return (ret);
87 }
88
89 /* read the domain from the xenvironment or one of the files */
readdomain(char * buf,int size)90 static char *readdomain(char *buf, int size)
91 {
92 char *ret;
93
94 if ((ret = xgetenv("DOMAIN")) != 0) {
95 (void) strncpy(buf, ret, size);
96 return (buf);
97 }
98
99 if (((ret = look4domain("/etc/resolv.conf", buf, size)) != 0) ||
100 ((ret = look4domain("/etc/inet/named.boot", buf, size)) != 0) ||
101 ((ret = look4domain("/etc/named.boot", buf, size)) != 0))
102 return (ret);
103
104 #ifdef SVR4
105 if (sysinfo(SI_SRPC_DOMAIN, buf, size) >= 0)
106 return (buf);
107 #endif
108
109 return (0);
110 }
111
112 char *
maildomain(void)113 maildomain(void)
114 {
115 static char *domain = 0;
116 static char dombuf[NMLN+1] = ".";
117
118 /* if we've already been here, return the info */
119 if (domain != 0)
120 return (domain);
121
122 domain = readdomain(dombuf+1, NMLN);
123
124 /* Make certain that the domain begins with a single dot */
125 /* and does not have one at the end. */
126 if (domain) {
127 size_t len;
128 domain = dombuf;
129 while (*domain && *domain == '.')
130 domain++;
131 domain--;
132 len = strlen(domain);
133 while ((len > 0) && (domain[len-1] == '.'))
134 domain[--len] = '\0';
135 }
136 /* no domain information */
137 else
138 domain = "";
139
140 return (domain);
141 }
142