#include <locale.h>
#endif
+#ifndef HAVE_DECL_GETENV
extern char *getenv(const char *); /* needed on sysV68 R3V7.1. */
+#endif
void envquery(int argc, char **argv)
/* set up basic stuff from the environment (including the rc file name) */
{
struct passwd by_name, by_uid, *pwp;
+ (void)argc;
+
+ (void)argc;
if (!(user = getenv("FETCHMAILUSER")))
{
if (!(user = getenv("LOGNAME")))
user = xstrdup(pwp->pw_name);
}
+ endpwent();
+
/* compute user's home directory */
home = getenv("HOME_ETC");
if (!home && !(home = getenv("HOME")))
- home = pwp->pw_dir;
+ home = xstrdup(pwp->pw_dir);
/* compute fetchmail's home directory */
if (!(fmhome = getenv("FETCHMAILHOME")))
strcat(rcfile, RCFILE_NAME);
}
-char *host_fqdn(int required /** barf if the name cannot be resolved */)
-/* get the FQDN of the machine we're running */
+char *host_fqdn(int required)
{
char tmpbuf[HOSTLEN+1];
char *result;
exit(PS_DNS);
}
- /* if we got a . in the hostname assume it is a FQDN */
+ /* if we got no . in the hostname, try to canonicalize it,
+ * else assume it is a FQDN */
if (strchr(tmpbuf, '.') == NULL)
{
- /* if we got a basename (as we do in Linux) make a FQDN of it */
+ /* if we got a basename without dots, as we often do in Linux,
+ * look up canonical name (make a FQDN of it) */
struct addrinfo hints, *res;
int e;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags=AI_CANONNAME;
+ hints.ai_flags = AI_CANONNAME;
- e = getaddrinfo(tmpbuf, NULL, &hints, &res);
+ e = fm_getaddrinfo(tmpbuf, NULL, &hints, &res);
if (e) {
/* exit with error message */
fprintf(stderr,
exit(PS_DNS);
else {
fprintf(stderr, GT_("Trying to continue with unqualified hostname.\nDO NOT report broken Received: headers, HELO/EHLO lines or similar problems!\nDO repair your /etc/hosts, DNS, NIS or LDAP instead.\n"));
- return 0;
+ return xstrdup(tmpbuf);
}
}
- result = xstrdup(res->ai_canonname);
- freeaddrinfo(res);
+ result = xstrdup(res->ai_canonname ? res->ai_canonname : tmpbuf);
+ fm_freeaddrinfo(res);
}
else
result = xstrdup(tmpbuf);
needed = strlen(buf) * 5 + 1; /* worst case: HEX, plus NUL byte */
- if (needed > vbufs) {
+ if (!vbuf || needed > vbufs) {
vbufs = needed;
- vbuf = xrealloc(vbuf, vbufs);
+ vbuf = (char *)xrealloc(vbuf, vbufs);
}
tp = vbuf;
buf++;
}
}
- *tp++ = '\0';
+ *tp = '\0';
return(vbuf);
}
/* env.c ends here */