imapext-2007

annotate src/osdep/wce/env_wce.c @ 0:ada5e610ab86

imap-2007e
author yuuji@gentei.org
date Mon, 14 Sep 2009 15:17:45 +0900
parents
children
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 }

UW-IMAP'd extensions by yuuji