]> Pileus Git - ~andy/fetchmail/blob - env.c
UTC > GMT.
[~andy/fetchmail] / env.c
1 /*
2  * env.c -- small service routines
3  *
4  * For license terms, see the file COPYING in this directory.
5  *
6  * i18n by Arnaldo Carvalho de Melo <acme@conectiva.com.br> 7-Nov-1998
7  */
8
9 #include "config.h"
10 #include <stdio.h>
11 #include <ctype.h>
12 #if defined(STDC_HEADERS)
13 #include <stdlib.h>
14 #endif
15 #if defined(HAVE_UNISTD_H)
16 #include <unistd.h>
17 #endif
18 #include <pwd.h>
19 #include <string.h>
20 #include <ctype.h>
21 #ifdef HAVE_GETHOSTBYNAME
22 #include <netdb.h>
23 #endif /* HAVE_GETHOSTBYNAME */
24 #ifndef HAVE_STRFTIME /* For ctime prototype */
25 #include  <sys/types.h>
26 #include  <time.h>
27 #endif
28 #include "fetchmail.h"
29
30 #include "i18n.h"
31
32 extern char *getenv();  /* needed on sysV68 R3V7.1. */
33
34 extern char *program_name;
35
36 void envquery(int argc, char **argv)
37 /* set up basic stuff from the environment (including the rc file name) */
38 {
39     struct passwd *pw;
40
41     if ((program_name = strrchr(argv[0], '/')) != NULL)
42         ++program_name;
43     else
44         program_name = argv[0];
45
46     if ((user = getenv("USER")) == (char *)NULL)
47         user = getenv("LOGNAME");
48
49     if ((user == (char *)NULL) || (home = getenv("HOME")) == (char *)NULL)
50     {
51         if ((pw = getpwuid(getuid())) != NULL)
52         {
53             user = pw->pw_name;
54             home = pw->pw_dir;
55         }
56         else
57         {
58             fprintf(stderr,
59                     _("%s: can't find your name and home directory!\n"),
60                     program_name);
61             exit(PS_UNDEFINED);
62         }
63     }
64
65 #define RCFILE_NAME     ".fetchmailrc"
66     rcfile = (char *) xmalloc(strlen(home)+strlen(RCFILE_NAME)+2);
67     /* avoid //.fetchmailrc */
68     if (strcmp(home, "/") != 0) {
69         strcpy(rcfile, home);
70     } else {
71         *rcfile = '\0';
72     }
73     strcat(rcfile, "/");
74     strcat(rcfile, RCFILE_NAME);
75 }
76
77 char *host_fqdn(void)
78 /* get the FQDN of the machine we're running */
79 {
80     char        tmpbuf[HOSTLEN+1];
81
82     if (gethostname(tmpbuf, sizeof(tmpbuf)))
83     {
84         fprintf(stderr, _("%s: can't determine your host!"),
85                 program_name);
86         exit(PS_DNS);
87     }
88 #ifdef HAVE_GETHOSTBYNAME
89     /* if we got a . in the hostname assume it is a FQDN */
90     if (strchr(tmpbuf, '.') == NULL)
91     {
92         struct hostent *hp;
93
94         /* if we got a basename (as we do in Linux) make a FQDN of it */
95         hp = gethostbyname(tmpbuf);
96         if (hp == (struct hostent *) NULL)
97         {
98             /* exit with error message */
99             fprintf(stderr,
100                     _("gethostbyname failed for %s\n"), tmpbuf);
101             exit(PS_DNS);
102         }
103         return(xstrdup(hp->h_name));
104     }
105     else
106 #endif /* HAVE_GETHOSTBYNAME */
107         return(xstrdup(tmpbuf));
108 }
109
110 char *rfc822timestamp(void)
111 /* return a timestamp in RFC822 form */
112 {
113     time_t      now;
114     static char buf[40];
115
116     time(&now);
117 #ifdef HAVE_STRFTIME
118     /*
119      * Conform to RFC822. UTC rather than local time because of the
120      * mess that %Z generates obsolete 822 syntax but %z is not
121      * guaranteed portable. We generate a 4-digit year here, avoiding
122      * Y2K hassles.  Max length of this timestamp in an English locale
123      * should be 29 chars.  The only things that should vary by locale
124      * are the day and month abbreviations.
125      */
126     strftime(buf, sizeof(buf)-1, 
127              "%a, %d %b %Y %H:%M:%S +0000 (UTC)",
128              gmtime(&now));
129 #else
130     /*
131      * This is really just a portability fallback, as the
132      * date format ctime(3) emits is not RFC822
133      * conformant.
134      */
135     strcpy(buf, ctime(&now));
136     buf[strlen(buf)-1] = '\0';  /* remove trailing \n */
137 #endif /* HAVE_STRFTIME */
138
139     return(buf);
140 }
141
142 const char *showproto(int proto)
143 /* protocol index to protocol name mapping */
144 {
145     switch (proto)
146     {
147     case P_AUTO: return("auto"); break;
148 #ifdef POP2_ENABLE
149     case P_POP2: return("POP2"); break;
150 #endif /* POP2_ENABLE */
151     case P_POP3: return("POP3"); break;
152     case P_IMAP: return("IMAP"); break;
153     case P_IMAP_K4: return("IMAP-K4"); break;
154 #ifdef GSSAPI
155     case P_IMAP_GSS: return("IMAP-GSS"); break;
156 #endif /* GSSAPI */
157     case P_APOP: return("APOP"); break;
158     case P_RPOP: return("RPOP"); break;
159     case P_ETRN: return("ETRN"); break;
160     default: return("unknown?!?"); break;
161     }
162 }
163
164 char *visbuf(const char *buf)
165 /* visibilize a given string */
166 {
167     static char vbuf[BUFSIZ];
168     char *tp = vbuf;
169
170     while (*buf)
171     {
172         if (*buf == '"')
173         {
174             *tp++ = '\\'; *tp++ = '"';
175             buf++;
176         }
177         else if (isprint(*buf) || *buf == ' ')
178             *tp++ = *buf++;
179         else if (*buf == '\n')
180         {
181             *tp++ = '\\'; *tp++ = 'n';
182             buf++;
183         }
184         else if (*buf == '\r')
185         {
186             *tp++ = '\\'; *tp++ = 'r';
187             buf++;
188         }
189         else if (*buf == '\b')
190         {
191             *tp++ = '\\'; *tp++ = 'b';
192             buf++;
193         }
194         else if (*buf < ' ')
195         {
196             *tp++ = '\\'; *tp++ = '^'; *tp++ = '@' + *buf;
197             buf++;
198         }
199         else
200         {
201             (void) sprintf(tp, "\\0x%02x", *buf++);
202             tp += strlen(tp);
203         }
204     }
205     *tp++ = '\0';
206     return(vbuf);
207 }
208
209 /* env.c ends here */