2 * Copyright (c) 2008 The DragonFly Project. All rights reserved.
4 * This code is derived from software contributed to The DragonFly Project
5 * by Simon 'corecode' Schubert <corecode@fs.ei.tum.de>.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
17 * 3. Neither the name of The DragonFly Project nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific, prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 #include <sys/param.h>
49 static char name
[MAXHOSTNAMELEN
+1];
57 if (config
->mailname
!= NULL
&& config
->mailname
[0] != '\0') {
58 snprintf(name
, sizeof(name
), "%s", config
->mailname
);
62 if (config
->mailnamefile
!= NULL
&& config
->mailnamefile
[0] != '\0') {
63 fp
= fopen(config
->mailnamefile
, "r");
65 if (fgets(name
, sizeof(name
), fp
) != NULL
) {
68 (name
[len
- 1] == '\r' ||
69 name
[len
- 1] == '\n'))
71 if (name
[0] != '\0') {
79 if (gethostname(name
, sizeof(name
)) != 0)
80 strcpy(name
, "(unknown hostname)");
86 setlogident(const char *fmt
, ...)
95 vasprintf(&sufx
, fmt
, ap
);
97 asprintf(&tag
, "%s[%s]", logident_base
, sufx
);
103 openlog(tag
!= NULL
? tag
: logident_base
, 0, LOG_MAIL
);
107 errlog(int exitcode
, const char *fmt
, ...)
115 vasprintf(&outs
, fmt
, ap
);
120 syslog(LOG_ERR
, "%s: %m", outs
);
121 fprintf(stderr
, "%s: %s: %s\n", getprogname(), outs
, strerror(oerrno
));
123 syslog(LOG_ERR
, "%m");
124 fprintf(stderr
, "%s: %s\n", getprogname(), strerror(oerrno
));
131 errlogx(int exitcode
, const char *fmt
, ...)
138 vasprintf(&outs
, fmt
, ap
);
143 syslog(LOG_ERR
, "%s", outs
);
144 fprintf(stderr
, "%s: %s\n", getprogname(), outs
);
146 syslog(LOG_ERR
, "Unknown error");
147 fprintf(stderr
, "%s: Unknown error\n", getprogname());
154 check_username(const char *name
, uid_t ckuid
)
160 pwd
= getpwnam(name
);
161 if (pwd
== NULL
|| pwd
->pw_uid
!= ckuid
)
174 username
= check_username(getlogin(), uid
);
175 if (username
!= NULL
)
177 username
= check_username(getenv("LOGNAME"), uid
);
178 if (username
!= NULL
)
180 username
= check_username(getenv("USER"), uid
);
181 if (username
!= NULL
)
184 if (pwd
!= NULL
&& pwd
->pw_name
!= NULL
&& pwd
->pw_name
[0] != '\0' &&
185 (u
= strdup(pwd
->pw_name
)) != NULL
) {
186 username
= check_username(u
, uid
);
187 if (username
!= NULL
)
192 asprintf(__DECONST(void *, &username
), "%ld", (long)uid
);
193 if (username
!= NULL
)
195 username
= "unknown-or-invalid-username";
203 SLIST_FOREACH(t
, &tmpfs
, next
) {
209 open_locked(const char *fname
, int flags
, ...)
213 if (flags
& O_CREAT
) {
216 mode
= va_arg(ap
, int);
223 fd
= open(fname
, flags
, mode
);
226 if (flock(fd
, LOCK_EX
|((flags
& O_NONBLOCK
)? LOCK_NB
: 0)) < 0) {
234 return(open(fname
, flags
|O_EXLOCK
, mode
));
246 error
= strftime(str
, sizeof(str
), "%a, %d %b %Y %T %z",
249 strcpy(str
, "(date fail)");
254 strprefixcmp(const char *str
, const char *prefix
)
256 return (strncasecmp(str
, prefix
, strlen(prefix
)));