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: Environment routines -- TOPS-20 version
|
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 /* Dedication:
|
yuuji@0
|
31 * This file is dedicated with affection to the TOPS-20 operating system, which
|
yuuji@0
|
32 * set standards for user and programmer friendliness that have still not been
|
yuuji@0
|
33 * equaled by more `modern' operating systems.
|
yuuji@0
|
34 * Wasureru mon ka!!!!
|
yuuji@0
|
35 */
|
yuuji@0
|
36
|
yuuji@0
|
37 /* c-client environment parameters */
|
yuuji@0
|
38
|
yuuji@0
|
39 static char *myUserName = NIL; /* user name */
|
yuuji@0
|
40 static char *myHomeDir = NIL; /* home directory name */
|
yuuji@0
|
41 static char *myLocalHost = NIL; /* local host name */
|
yuuji@0
|
42 static char *myNewsrc = NIL; /* newsrc file name */
|
yuuji@0
|
43 static short no822tztext = NIL; /* disable RFC [2]822 timezone text */
|
yuuji@0
|
44
|
yuuji@0
|
45
|
yuuji@0
|
46 #include "pmatch.c" /* include wildcard pattern matcher */
|
yuuji@0
|
47
|
yuuji@0
|
48 /* Environment manipulate parameters
|
yuuji@0
|
49 * Accepts: function code
|
yuuji@0
|
50 * function-dependent value
|
yuuji@0
|
51 * Returns: function-dependent return value
|
yuuji@0
|
52 */
|
yuuji@0
|
53
|
yuuji@0
|
54 void *env_parameters (long function,void *value)
|
yuuji@0
|
55 {
|
yuuji@0
|
56 void *ret = NIL;
|
yuuji@0
|
57 switch ((int) function) {
|
yuuji@0
|
58 case SET_USERNAME:
|
yuuji@0
|
59 if (myUserName) fs_give ((void **) &myUserName);
|
yuuji@0
|
60 myUserName = cpystr ((char *) value);
|
yuuji@0
|
61 case GET_USERNAME:
|
yuuji@0
|
62 ret = (void *) myUserName;
|
yuuji@0
|
63 break;
|
yuuji@0
|
64 case SET_HOMEDIR:
|
yuuji@0
|
65 if (myHomeDir) fs_give ((void **) &myHomeDir);
|
yuuji@0
|
66 myHomeDir = cpystr ((char *) value);
|
yuuji@0
|
67 case GET_HOMEDIR:
|
yuuji@0
|
68 ret = (void *) myHomeDir;
|
yuuji@0
|
69 break;
|
yuuji@0
|
70 case SET_LOCALHOST:
|
yuuji@0
|
71 if (myLocalHost) fs_give ((void **) &myLocalHost);
|
yuuji@0
|
72 myLocalHost = cpystr ((char *) value);
|
yuuji@0
|
73 case GET_LOCALHOST:
|
yuuji@0
|
74 ret = (void *) myLocalHost;
|
yuuji@0
|
75 break;
|
yuuji@0
|
76 case SET_NEWSRC:
|
yuuji@0
|
77 if (myNewsrc) fs_give ((void **) &myNewsrc);
|
yuuji@0
|
78 myNewsrc = cpystr ((char *) value);
|
yuuji@0
|
79 case GET_NEWSRC:
|
yuuji@0
|
80 ret = (void *) myNewsrc;
|
yuuji@0
|
81 break;
|
yuuji@0
|
82 case SET_DISABLE822TZTEXT:
|
yuuji@0
|
83 no822tztext = value ? T : NIL;
|
yuuji@0
|
84 case GET_DISABLE822TZTEXT:
|
yuuji@0
|
85 ret = (void *) (no822tztext ? VOIDT : NIL);
|
yuuji@0
|
86 break;
|
yuuji@0
|
87 }
|
yuuji@0
|
88 return ret;
|
yuuji@0
|
89 }
|
yuuji@0
|
90
|
yuuji@0
|
91 /* Write current time in RFC 822 format
|
yuuji@0
|
92 * Accepts: destination string
|
yuuji@0
|
93 */
|
yuuji@0
|
94
|
yuuji@0
|
95 void rfc822_date (char *date)
|
yuuji@0
|
96 {
|
yuuji@0
|
97 char *s;
|
yuuji@0
|
98 int argblk[4];
|
yuuji@0
|
99 argblk[1] = (int) (date-1);
|
yuuji@0
|
100 argblk[2] = -1; /* time now */
|
yuuji@0
|
101 argblk[3] = OT_822; /* want RFC [2]822 format */
|
yuuji@0
|
102 jsys (ODTIM,argblk);
|
yuuji@0
|
103 /* suppress time zone text if desired */
|
yuuji@0
|
104 if (no822tztext && (s = strstr (date," ("))) *s = NIL;
|
yuuji@0
|
105 }
|
yuuji@0
|
106
|
yuuji@0
|
107
|
yuuji@0
|
108 /* Write current time in internal format
|
yuuji@0
|
109 * Accepts: destination string
|
yuuji@0
|
110 */
|
yuuji@0
|
111
|
yuuji@0
|
112 void internal_date (char *date)
|
yuuji@0
|
113 {
|
yuuji@0
|
114 int argblk[5];
|
yuuji@0
|
115 argblk[1] = (int) (date-1);
|
yuuji@0
|
116 argblk[2] = -1; /* time now */
|
yuuji@0
|
117 argblk[3] = OT_4YR; /* output in 4-digit year format */
|
yuuji@0
|
118 jsys (ODTIM,argblk);
|
yuuji@0
|
119 argblk[2] = ' '; /* delimit with space */
|
yuuji@0
|
120 jsys (BOUT,argblk);
|
yuuji@0
|
121 argblk[2] = -1; /* time now */
|
yuuji@0
|
122 argblk[4] = 0; /* no flags */
|
yuuji@0
|
123 jsys (ODCNV,argblk); /* get time zone */
|
yuuji@0
|
124 argblk[2] = ((argblk[4] & 077000000) >> 18) * -100;
|
yuuji@0
|
125 /* add an hour if summer time */
|
yuuji@0
|
126 if (argblk[4] & IC_ADS) argblk[2] += 100;
|
yuuji@0
|
127 argblk[3] = 0340005000012;
|
yuuji@0
|
128 jsys (NOUT,argblk);
|
yuuji@0
|
129 }
|
yuuji@0
|
130
|
yuuji@0
|
131 /* Return my user name
|
yuuji@0
|
132 * Accepts: pointer to optional flags
|
yuuji@0
|
133 * Returns: my user name
|
yuuji@0
|
134 */
|
yuuji@0
|
135
|
yuuji@0
|
136 char *myusername_full (unsigned long *flags)
|
yuuji@0
|
137 {
|
yuuji@0
|
138 if (!myUserName) { /* get user name if don't have it yet */
|
yuuji@0
|
139 char tmp[MAILTMPLEN];
|
yuuji@0
|
140 int argblk[5],i;
|
yuuji@0
|
141 jsys (GJINF,argblk); /* get job poop */
|
yuuji@0
|
142 if (!(i = argblk[1])) { /* remember user number */
|
yuuji@0
|
143 if (flags) *flags = MU_NOTLOGGEDIN;
|
yuuji@0
|
144 return "SYSTEM"; /* not logged in */
|
yuuji@0
|
145 }
|
yuuji@0
|
146 argblk[1] = (int) (tmp-1); /* destination */
|
yuuji@0
|
147 argblk[2] = i; /* user number */
|
yuuji@0
|
148 jsys (DIRST,argblk); /* get user name string */
|
yuuji@0
|
149 myUserName = cpystr (tmp); /* copy user name */
|
yuuji@0
|
150 argblk[1] = 0; /* no flags */
|
yuuji@0
|
151 argblk[2] = i; /* user number */
|
yuuji@0
|
152 argblk[3] = 0; /* no stepping */
|
yuuji@0
|
153 jsys (RCDIR,argblk); /* get home directory */
|
yuuji@0
|
154 argblk[1] = (int) (tmp-1); /* destination */
|
yuuji@0
|
155 argblk[2] = argblk[3]; /* home directory number */
|
yuuji@0
|
156 jsys (DIRST,argblk); /* get home directory string */
|
yuuji@0
|
157 myHomeDir = cpystr (tmp); /* copy home directory */
|
yuuji@0
|
158 if (!myNewsrc) { /* set news file name if not defined */
|
yuuji@0
|
159 sprintf (tmp,"%sNEWSRC",myhomedir ());
|
yuuji@0
|
160 myNewsrc = cpystr (tmp);
|
yuuji@0
|
161 }
|
yuuji@0
|
162 if (flags) *flags = MU_LOGGEDIN;
|
yuuji@0
|
163 }
|
yuuji@0
|
164 return myUserName;
|
yuuji@0
|
165 }
|
yuuji@0
|
166
|
yuuji@0
|
167 /* Return my local host name
|
yuuji@0
|
168 * Returns: my local host name
|
yuuji@0
|
169 */
|
yuuji@0
|
170
|
yuuji@0
|
171 char *mylocalhost ()
|
yuuji@0
|
172 {
|
yuuji@0
|
173 if (!myLocalHost) { /* initialize if first time */
|
yuuji@0
|
174 char tmp[MAILTMPLEN];
|
yuuji@0
|
175 int argblk[5];
|
yuuji@0
|
176 argblk[1] = _GTHNS; /* convert number to string */
|
yuuji@0
|
177 argblk[2] = (int) (tmp-1);
|
yuuji@0
|
178 argblk[3] = -1; /* want local host */
|
yuuji@0
|
179 if (!jsys (GTHST,argblk)) strcpy (tmp,"LOCAL");
|
yuuji@0
|
180 myLocalHost = cpystr (tmp);
|
yuuji@0
|
181 }
|
yuuji@0
|
182 return myLocalHost;
|
yuuji@0
|
183 }
|
yuuji@0
|
184
|
yuuji@0
|
185
|
yuuji@0
|
186 /* Return my home directory name
|
yuuji@0
|
187 * Returns: my home directory name
|
yuuji@0
|
188 */
|
yuuji@0
|
189
|
yuuji@0
|
190 char *myhomedir ()
|
yuuji@0
|
191 {
|
yuuji@0
|
192 if (!myHomeDir) myusername ();/* initialize if first time */
|
yuuji@0
|
193 return myHomeDir ? myHomeDir : "";
|
yuuji@0
|
194 }
|
yuuji@0
|
195
|
yuuji@0
|
196
|
yuuji@0
|
197 /* Determine default prototype stream to user
|
yuuji@0
|
198 * Accepts: type (NIL for create, T for append)
|
yuuji@0
|
199 * Returns: default prototype stream
|
yuuji@0
|
200 */
|
yuuji@0
|
201
|
yuuji@0
|
202 MAILSTREAM *default_proto (long type)
|
yuuji@0
|
203 {
|
yuuji@0
|
204 return NIL; /* no default prototype */
|
yuuji@0
|
205 }
|
yuuji@0
|
206
|
yuuji@0
|
207 /* Emulator for BSD syslog() routine
|
yuuji@0
|
208 * Accepts: priority
|
yuuji@0
|
209 * message
|
yuuji@0
|
210 * parameters
|
yuuji@0
|
211 */
|
yuuji@0
|
212
|
yuuji@0
|
213 void syslog (int priority,const char *message,...)
|
yuuji@0
|
214 {
|
yuuji@0
|
215 }
|
yuuji@0
|
216
|
yuuji@0
|
217
|
yuuji@0
|
218 /* Emulator for BSD openlog() routine
|
yuuji@0
|
219 * Accepts: identity
|
yuuji@0
|
220 * options
|
yuuji@0
|
221 * facility
|
yuuji@0
|
222 */
|
yuuji@0
|
223
|
yuuji@0
|
224 void openlog (const char *ident,int logopt,int facility)
|
yuuji@0
|
225 {
|
yuuji@0
|
226 }
|