rev |
line source |
yuuji@0
|
1 /* ========================================================================
|
yuuji@0
|
2 * Copyright 1988-2006 University of Washington
|
yuuji@0
|
3 *
|
yuuji@0
|
4 * Licensed under the Apache License, Version 2.0 (the "License");
|
yuuji@0
|
5 * you may not use this file except in compliance with the License.
|
yuuji@0
|
6 * You may obtain a copy of the License at
|
yuuji@0
|
7 *
|
yuuji@0
|
8 * http://www.apache.org/licenses/LICENSE-2.0
|
yuuji@0
|
9 *
|
yuuji@0
|
10 *
|
yuuji@0
|
11 * ========================================================================
|
yuuji@0
|
12 */
|
yuuji@0
|
13
|
yuuji@0
|
14 /*
|
yuuji@0
|
15 * Program: WCE environment routines
|
yuuji@0
|
16 *
|
yuuji@0
|
17 * Author: Mark Crispin
|
yuuji@0
|
18 * Networks and Distributed Computing
|
yuuji@0
|
19 * Computing & Communications
|
yuuji@0
|
20 * University of Washington
|
yuuji@0
|
21 * Administration Building, AG-44
|
yuuji@0
|
22 * Seattle, WA 98195
|
yuuji@0
|
23 * Internet: MRC@CAC.Washington.EDU
|
yuuji@0
|
24 *
|
yuuji@0
|
25 * Date: 1 August 1988
|
yuuji@0
|
26 * Last Edited: 30 August 2006
|
yuuji@0
|
27 */
|
yuuji@0
|
28
|
yuuji@0
|
29
|
yuuji@0
|
30 static char *myUserName = NIL; /* user name */
|
yuuji@0
|
31 static char *myLocalHost = NIL; /* local host name */
|
yuuji@0
|
32 static char *myClientHost = NIL;/* client host name */
|
yuuji@0
|
33 static char *myServerHost = NIL;/* server host name */
|
yuuji@0
|
34 static char *myHomeDir = NIL; /* home directory name */
|
yuuji@0
|
35 static char *myNewsrc = NIL; /* newsrc file name */
|
yuuji@0
|
36 static char *sysInbox = NIL; /* system inbox name */
|
yuuji@0
|
37 static long list_max_level = 5; /* maximum level of list recursion */
|
yuuji@0
|
38 static short no822tztext = NIL; /* disable RFC [2]822 timezone text */
|
yuuji@0
|
39 /* home namespace */
|
yuuji@0
|
40 static NAMESPACE nshome = {"",'\\',NIL,NIL};
|
yuuji@0
|
41 /* namespace list */
|
yuuji@0
|
42 static NAMESPACE *nslist[3] = {&nshome,NIL,NIL};
|
yuuji@0
|
43 static long alarm_countdown = 0;/* alarm count down */
|
yuuji@0
|
44 static void (*alarm_rang) (); /* alarm interrupt function */
|
yuuji@0
|
45 static unsigned int rndm = 0; /* initial `random' number */
|
yuuji@0
|
46
|
yuuji@0
|
47
|
yuuji@0
|
48 /* Dummy definitions to prevent errors */
|
yuuji@0
|
49
|
yuuji@0
|
50 #define server_login(user,pass,authuser,argc,argv) NIL
|
yuuji@0
|
51 #define authserver_login(user,authuser,argc,argv) NIL
|
yuuji@0
|
52 #define myusername() ""
|
yuuji@0
|
53 #define MD5ENABLE "\\.nosuch.."
|
yuuji@0
|
54
|
yuuji@0
|
55 #include "pmatch.c" /* include wildcard pattern matcher */
|
yuuji@0
|
56
|
yuuji@0
|
57 /* Environment manipulate parameters
|
yuuji@0
|
58 * Accepts: function code
|
yuuji@0
|
59 * function-dependent value
|
yuuji@0
|
60 * Returns: function-dependent return value
|
yuuji@0
|
61 */
|
yuuji@0
|
62
|
yuuji@0
|
63 void *env_parameters (long function,void *value)
|
yuuji@0
|
64 {
|
yuuji@0
|
65 void *ret = NIL;
|
yuuji@0
|
66 switch ((int) function) {
|
yuuji@0
|
67 case GET_NAMESPACE:
|
yuuji@0
|
68 ret = (void *) nslist;
|
yuuji@0
|
69 break;
|
yuuji@0
|
70 case SET_HOMEDIR:
|
yuuji@0
|
71 myHomeDir = cpystr ((char *) value);
|
yuuji@0
|
72 case GET_HOMEDIR:
|
yuuji@0
|
73 ret = (void *) myHomeDir;
|
yuuji@0
|
74 break;
|
yuuji@0
|
75 case SET_LOCALHOST:
|
yuuji@0
|
76 myLocalHost = cpystr ((char *) value);
|
yuuji@0
|
77 case GET_LOCALHOST:
|
yuuji@0
|
78 ret = (void *) myLocalHost;
|
yuuji@0
|
79 break;
|
yuuji@0
|
80 case SET_NEWSRC:
|
yuuji@0
|
81 if (myNewsrc) fs_give ((void **) &myNewsrc);
|
yuuji@0
|
82 myNewsrc = cpystr ((char *) value);
|
yuuji@0
|
83 case GET_NEWSRC:
|
yuuji@0
|
84 if (!myNewsrc) { /* set news file name if not defined */
|
yuuji@0
|
85 char tmp[MAILTMPLEN];
|
yuuji@0
|
86 sprintf (tmp,"%s\\NEWSRC",myhomedir ());
|
yuuji@0
|
87 myNewsrc = cpystr (tmp);
|
yuuji@0
|
88 }
|
yuuji@0
|
89 ret = (void *) myNewsrc;
|
yuuji@0
|
90 break;
|
yuuji@0
|
91 case SET_SYSINBOX:
|
yuuji@0
|
92 if (sysInbox) fs_give ((void **) &sysInbox);
|
yuuji@0
|
93 sysInbox = cpystr ((char *) value);
|
yuuji@0
|
94 case GET_SYSINBOX:
|
yuuji@0
|
95 ret = (void *) sysInbox;
|
yuuji@0
|
96 break;
|
yuuji@0
|
97 case SET_LISTMAXLEVEL:
|
yuuji@0
|
98 list_max_level = (long) value;
|
yuuji@0
|
99 case GET_LISTMAXLEVEL:
|
yuuji@0
|
100 ret = (void *) list_max_level;
|
yuuji@0
|
101 break;
|
yuuji@0
|
102 case SET_DISABLE822TZTEXT:
|
yuuji@0
|
103 no822tztext = value ? T : NIL;
|
yuuji@0
|
104 case GET_DISABLE822TZTEXT:
|
yuuji@0
|
105 ret = (void *) (no822tztext ? VOIDT : NIL);
|
yuuji@0
|
106 break;
|
yuuji@0
|
107 }
|
yuuji@0
|
108 return ret;
|
yuuji@0
|
109 }
|
yuuji@0
|
110
|
yuuji@0
|
111 /* Write current time
|
yuuji@0
|
112 * Accepts: destination string
|
yuuji@0
|
113 * optional format of day-of-week prefix
|
yuuji@0
|
114 * format of date and time
|
yuuji@0
|
115 * flag whether to append symbolic timezone
|
yuuji@0
|
116 */
|
yuuji@0
|
117
|
yuuji@0
|
118 static void do_date (char *date,char *prefix,char *fmt,int suffix)
|
yuuji@0
|
119 {
|
yuuji@0
|
120 time_t tn = time (0);
|
yuuji@0
|
121 struct tm *t = gmtime (&tn);
|
yuuji@0
|
122 int zone = t->tm_hour * 60 + t->tm_min;
|
yuuji@0
|
123 int julian = t->tm_yday;
|
yuuji@0
|
124 t = localtime (&tn); /* get local time now */
|
yuuji@0
|
125 /* minus UTC minutes since midnight */
|
yuuji@0
|
126 zone = t->tm_hour * 60 + t->tm_min - zone;
|
yuuji@0
|
127 /* julian can be one of:
|
yuuji@0
|
128 * 36x local time is December 31, UTC is January 1, offset -24 hours
|
yuuji@0
|
129 * 1 local time is 1 day ahead of UTC, offset +24 hours
|
yuuji@0
|
130 * 0 local time is same day as UTC, no offset
|
yuuji@0
|
131 * -1 local time is 1 day behind UTC, offset -24 hours
|
yuuji@0
|
132 * -36x local time is January 1, UTC is December 31, offset +24 hours
|
yuuji@0
|
133 */
|
yuuji@0
|
134 if (julian = t->tm_yday -julian)
|
yuuji@0
|
135 zone += ((julian < 0) == (abs (julian) == 1)) ? -24*60 : 24*60;
|
yuuji@0
|
136 if (prefix) { /* want day of week? */
|
yuuji@0
|
137 sprintf (date,prefix,days[t->tm_wday]);
|
yuuji@0
|
138 date += strlen (date); /* make next sprintf append */
|
yuuji@0
|
139 }
|
yuuji@0
|
140 /* output the date */
|
yuuji@0
|
141 sprintf (date,fmt,t->tm_mday,months[t->tm_mon],t->tm_year+1900,
|
yuuji@0
|
142 t->tm_hour,t->tm_min,t->tm_sec,zone/60,abs (zone) % 60);
|
yuuji@0
|
143 if (suffix) { /* append timezone suffix if desired */
|
yuuji@0
|
144 char *tz;
|
yuuji@0
|
145 tzset (); /* get timezone from TZ environment stuff */
|
yuuji@0
|
146 tz = tzname[daylight ? (((struct tm *) t)->tm_isdst > 0) : 0];
|
yuuji@0
|
147 if (tz && tz[0]) sprintf (date + strlen (date)," (%s)",tz);
|
yuuji@0
|
148 }
|
yuuji@0
|
149 }
|
yuuji@0
|
150
|
yuuji@0
|
151
|
yuuji@0
|
152 /* Write current time in RFC 822 format
|
yuuji@0
|
153 * Accepts: destination string
|
yuuji@0
|
154 */
|
yuuji@0
|
155
|
yuuji@0
|
156 void rfc822_date (char *date)
|
yuuji@0
|
157 {
|
yuuji@0
|
158 do_date (date,"%s, ","%d %s %d %02d:%02d:%02d %+03d%02d",
|
yuuji@0
|
159 no822tztext ? NIL : T);
|
yuuji@0
|
160 }
|
yuuji@0
|
161
|
yuuji@0
|
162
|
yuuji@0
|
163 /* Write current time in internal format
|
yuuji@0
|
164 * Accepts: destination string
|
yuuji@0
|
165 */
|
yuuji@0
|
166
|
yuuji@0
|
167 void internal_date (char *date)
|
yuuji@0
|
168 {
|
yuuji@0
|
169 do_date (date,NIL,"%02d-%s-%d %02d:%02d:%02d %+03d%02d",NIL);
|
yuuji@0
|
170 }
|
yuuji@0
|
171
|
yuuji@0
|
172 /* Return random number
|
yuuji@0
|
173 */
|
yuuji@0
|
174
|
yuuji@0
|
175 long random ()
|
yuuji@0
|
176 {
|
yuuji@0
|
177 if (!rndm) srand (rndm = (unsigned) time (0L));
|
yuuji@0
|
178 return (long) rand ();
|
yuuji@0
|
179 }
|
yuuji@0
|
180
|
yuuji@0
|
181 /* Return default drive
|
yuuji@0
|
182 * Returns: default drive
|
yuuji@0
|
183 */
|
yuuji@0
|
184
|
yuuji@0
|
185 static char *defaultDrive (void)
|
yuuji@0
|
186 {
|
yuuji@0
|
187 char *s;
|
yuuji@0
|
188 return ((s = getenv ("SystemDrive")) && *s) ? s : "C:";
|
yuuji@0
|
189 }
|
yuuji@0
|
190
|
yuuji@0
|
191
|
yuuji@0
|
192 /* Return home drive from environment variables
|
yuuji@0
|
193 * Returns: home drive
|
yuuji@0
|
194 */
|
yuuji@0
|
195
|
yuuji@0
|
196 static char *homeDrive (void)
|
yuuji@0
|
197 {
|
yuuji@0
|
198 char *s;
|
yuuji@0
|
199 return ((s = getenv ("HOMEDRIVE")) && *s) ? s : defaultDrive ();
|
yuuji@0
|
200 }
|
yuuji@0
|
201
|
yuuji@0
|
202
|
yuuji@0
|
203 /* Return home path from environment variables
|
yuuji@0
|
204 * Accepts: path to write into
|
yuuji@0
|
205 * Returns: home path or NIL if it can't be determined
|
yuuji@0
|
206 */
|
yuuji@0
|
207
|
yuuji@0
|
208 static char *homePath (char *path)
|
yuuji@0
|
209 {
|
yuuji@0
|
210 int i;
|
yuuji@0
|
211 char *s;
|
yuuji@0
|
212 if (!((s = getenv ("HOMEPATH")) && (i = strlen (s)))) return NIL;
|
yuuji@0
|
213 if (((s[i-1] == '\\') || (s[i-1] == '/'))) s[i-1] = '\0';
|
yuuji@0
|
214 sprintf (path,"%s%s",homeDrive (),s);
|
yuuji@0
|
215 return path;
|
yuuji@0
|
216 }
|
yuuji@0
|
217
|
yuuji@0
|
218 /* Return my home directory name
|
yuuji@0
|
219 * Returns: my home directory name
|
yuuji@0
|
220 */
|
yuuji@0
|
221
|
yuuji@0
|
222 char *myhomedir ()
|
yuuji@0
|
223 {
|
yuuji@0
|
224 char tmp[MAILTMPLEN];
|
yuuji@0
|
225 /* initialize if first time */
|
yuuji@0
|
226 if (!myHomeDir) myHomeDir = homePath (tmp);
|
yuuji@0
|
227 return myHomeDir ? myHomeDir : homeDrive ();
|
yuuji@0
|
228 }
|
yuuji@0
|
229
|
yuuji@0
|
230 /* Return system standard INBOX
|
yuuji@0
|
231 * Accepts: buffer string
|
yuuji@0
|
232 */
|
yuuji@0
|
233
|
yuuji@0
|
234 char *sysinbox ()
|
yuuji@0
|
235 {
|
yuuji@0
|
236 char tmp[MAILTMPLEN];
|
yuuji@0
|
237 if (!sysInbox) { /* initialize if first time */
|
yuuji@0
|
238 sprintf (tmp,"%s\\INBOX",myhomedir ());
|
yuuji@0
|
239 sysInbox = cpystr (tmp); /* system inbox is from mail spool */
|
yuuji@0
|
240 }
|
yuuji@0
|
241 return sysInbox;
|
yuuji@0
|
242 }
|
yuuji@0
|
243
|
yuuji@0
|
244
|
yuuji@0
|
245 /* Return mailbox file name
|
yuuji@0
|
246 * Accepts: destination buffer
|
yuuji@0
|
247 * mailbox name
|
yuuji@0
|
248 * Returns: file name
|
yuuji@0
|
249 */
|
yuuji@0
|
250
|
yuuji@0
|
251 char *mailboxfile (char *dst,char *name)
|
yuuji@0
|
252 {
|
yuuji@0
|
253 char *dir = myhomedir ();
|
yuuji@0
|
254 *dst = '\0'; /* default to empty string */
|
yuuji@0
|
255 if (((name[0] == 'I') || (name[0] == 'i')) &&
|
yuuji@0
|
256 ((name[1] == 'N') || (name[1] == 'n')) &&
|
yuuji@0
|
257 ((name[2] == 'B') || (name[2] == 'b')) &&
|
yuuji@0
|
258 ((name[3] == 'O') || (name[3] == 'o')) &&
|
yuuji@0
|
259 ((name[4] == 'X') || (name[4] == 'x')) && !name[5]) name = NIL;
|
yuuji@0
|
260 /* reject namespace names or names with / */
|
yuuji@0
|
261 if (name && ((*name == '#') || strchr (name,'/'))) return NIL;
|
yuuji@0
|
262 else if (!name) return dst; /* driver selects the INBOX name */
|
yuuji@0
|
263 /* absolute path name? */
|
yuuji@0
|
264 else if ((*name == '\\') || (name[1] == ':')) return strcpy (dst,name);
|
yuuji@0
|
265 /* build resulting name */
|
yuuji@0
|
266 sprintf (dst,"%s\\%s",dir,name);
|
yuuji@0
|
267 return dst; /* return it */
|
yuuji@0
|
268 }
|
yuuji@0
|
269
|
yuuji@0
|
270
|
yuuji@0
|
271 /* Determine default prototype stream to user
|
yuuji@0
|
272 * Accepts: type (NIL for create, T for append)
|
yuuji@0
|
273 * Returns: default prototype stream
|
yuuji@0
|
274 */
|
yuuji@0
|
275
|
yuuji@0
|
276 MAILSTREAM *default_proto (long type)
|
yuuji@0
|
277 {
|
yuuji@0
|
278 extern MAILSTREAM CREATEPROTO,APPENDPROTO;
|
yuuji@0
|
279 return type ? &APPENDPROTO : &CREATEPROTO;
|
yuuji@0
|
280 }
|
yuuji@0
|
281
|
yuuji@0
|
282 /* Emulator for BSD syslog() routine
|
yuuji@0
|
283 * Accepts: priority
|
yuuji@0
|
284 * message
|
yuuji@0
|
285 * parameters
|
yuuji@0
|
286 */
|
yuuji@0
|
287
|
yuuji@0
|
288 void syslog (int priority,const char *message,...)
|
yuuji@0
|
289 {
|
yuuji@0
|
290 }
|
yuuji@0
|
291
|
yuuji@0
|
292
|
yuuji@0
|
293 /* Emulator for BSD openlog() routine
|
yuuji@0
|
294 * Accepts: identity
|
yuuji@0
|
295 * options
|
yuuji@0
|
296 * facility
|
yuuji@0
|
297 */
|
yuuji@0
|
298
|
yuuji@0
|
299 void openlog (const char *ident,int logopt,int facility)
|
yuuji@0
|
300 {
|
yuuji@0
|
301 }
|