1 /*
2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 %
4 % File:         PXK:PSLEXTRAS.C
5 % Description:  Miscellaneous support routines.
6 % Author:       RAM, HP/FSD
7 % Created:      9-Mar-84
8 % Modified:     21-Mar-85 11:25:52
9 % Mode:         Text
10 % Package:
11 % Status:       Experimental (Do Not Distribute)
12 %
13 % (c) Copyright 1984, Hewlett-Packard Company, all rights reserved.
14 %
15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16 %
17 % Revisions:
18 %
19 % 05-Apr-88 (Julian Padget)
20 %  Reinstated alarm and ualarm (again)
21 % 29-May-87 (Leigh Stoller & Harold Carr)
22 %  Added external_setenv and friends.
23 % 21-Mar-85 11:09:00 (Scott Marovich)
24 %  Rewrite "timc()" to return time since 1st call, and never cream LISP tag.
25 % 21-Feb-85 09:02:49 (Vicki O'Day)
26 %  Fixed bug in uxwritefloat - it was setting the length field of the printable
27 %  string incorrectly.
28 % 18-Jul-84 11:14:24 (RAM)
29 %  Added external_time.  Put call to expand_file_name in external_stat,
30 %  external_link, and external_unlink.
31 % 10-Jul-84 (Vicki O'Day)
32 %  Added external_stat, external_link and external_unlink.
33 % 29-Jun-84 14:15:53 (RAM)
34 %  Removed hp_quit (obsolete).
35 % 27-Jun-84 (Vicki O'Day)
36 %  Added external_strlen and external_getenv.
37 %
38 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39 */
40 
41 #include <stdio.h>
42 #include <sys/types.h>
43 #include <sys/stat.h>
44 #include <sys/param.h>
45 #include <sys/times.h>
46 
external_alarm(sec)47 int external_alarm(sec)
48 unsigned long sec;
49 {
50   alarm(sec);
51 }
52 
external_ualarm(usec,repeat)53 int external_ualarm(usec,repeat)
54 unsigned long usec,repeat;
55 {
56   return (0); /*ualarm(usec,repeat); */
57 }
58 
59 char *expand_file_name();    /* from unix-io.c */
60 long time(), times();        /* from kernel */
61 
62 /* Tag( external_time )
63  */
external_time(tloc)64 long external_time(tloc)
65 long *tloc;
66 {
67   return (time(tloc));
68 }
69 
70 /* Tag( external_timc )
71  */
72 external_timc(buffer)
73      struct tms *buffer;
74 {
75   return(times(buffer));
76 }
77 
78 /* Tag( external_stat )
79  */
external_stat(path,buf)80 int external_stat(path, buf)
81 char *path;
82 struct stat *buf;
83 {
84     return stat(expand_file_name(path), buf);
85 }
86 
87 /* Tag( external_link )
88  */
external_link(path1,path2)89 int external_link (path1, path2)
90 char *path1, *path2;
91 {
92     return link(expand_file_name(path1), expand_file_name(path2));
93 }
94 
95 /* Tag( external_unlink )
96  */
external_unlink(path)97 int external_unlink (path)
98 char *path;
99 {
100     return unlink(expand_file_name(path));
101 }
102 
103 /* Tag( external_strlen )
104  */
external_strlen(s)105 int external_strlen (s)
106      char *s;
107 {
108     return strlen(s);
109 }
110 
111 /* Tag( external_getenv )
112  */
external_getenv(name)113 char *external_getenv (name)
114      char *name;
115 {
116     return (char *)getenv(name);
117 }
118 
119 
external_setenv(var,val)120 int external_setenv (var, val)
121     char *var, *val;
122 {
123   int i;
124   extern char **environ;
125   char **envnew;
126   char var_plus_equal_sign[100];
127 
128   /* Look for first empty slot to find number of existing env variables. */
129   for (i = 0 ; environ [i] != NULL ; i++) ;
130 
131   /* Make a new environment array with 2 new slots - 1 for var being set,
132      and 1 extra empty slot. */
133   envnew = (char **) calloc ((i + 2), sizeof(char *));
134 
135   block_copy((char *)environ, (char *)envnew, i * sizeof(char *));
136   environ = envnew;
137   strcpy(var_plus_equal_sign, var);
138   strcat(var_plus_equal_sign, "=");
139   return(setenv (var_plus_equal_sign, val));
140 }
141 
142 /*
143  * sets the value of var to be arg in the Unix environment env.
144  * Var should end with '=' (bindings are of the form "var=value").
145  * This procedure assumes the memory for the first level of environ
146  * was allocated using calloc, with enough extra room at the end so not
147  * to have to do a realloc().
148  */
setenv(var,value)149 setenv (var, value)
150      char *var, *value;
151 {
152     extern char **environ;
153     int index = 0;
154     int len = strlen(var);
155 
156     while (environ [index] != NULL) {
157         if (strncmp (environ [index], var, len) == 0) {
158         /* found it */
159         environ[index] = (char *)malloc (len + strlen (value) + 1);
160         strcpy (environ [index], var);
161         strcat (environ [index], value);
162         return;
163         }
164         index ++;
165     }
166 
167     environ [index] = (char *) malloc (len + strlen (value) + 1);
168     strcpy (environ [index], var);
169     strcat (environ [index], value);
170     environ [++index] = NULL;
171 }
172 
block_copy(b1,b2,length)173 block_copy (b1, b2, length)
174      char *b1, *b2;
175      int length;
176 {
177   while (length-- > 0)
178     *b2++ = *b1++;
179 }
180 
181 #define LISPEOF  4      /* Lisp uses ctrl-D for end of file */
182 
183 /* Tag( unixreadrecord )
184  */
unixreadrecord(fp,buf)185 int unixreadrecord(fp, buf)
186      FILE *fp;
187      char *buf;
188 {
189   int i;
190   char c;
191   for (i=0, c=' '; ((c != LISPEOF) && (c != '\n')); i++)
192     {
193       c = fgetc(fp);
194       if (c == EOF )
195     c = LISPEOF;
196       *buf++ = c;
197     }
198   return i;
199 }
200 
201 /* Tag( unixwriterecord )
202  */
unixwriterecord(fp,buf,count)203 int unixwriterecord(fp, buf, count)
204      FILE *fp;
205      char *buf;
206 int  count;
207 {
208   int i;
209   for (i=0; i<count; i++, buf++)
210     fputc(*buf, fp);
211 }
212 
213 #include <sys/mman.h>
214 
new_vvm_cflush(ad,len,inv)215 new_vvm_cflush (ad,len,inv) /* does not work */
216 
217 long ad,len,inv;
218 
219 { ad = ( ad / getpagesize()) * getpagesize();
220   if (mprotect(ad,50 * getpagesize(),PROT_READ | PROT_WRITE | PROT_EXEC) == -1)
221         perror("Error mprotect");
222   if (inv) { if (msync((caddr_t) ad,(size_t) (len+ getpagesize()),MS_SYNC | MS_INVALIDATE) == -1 )
223          perror("Error cacheflush") ; }
224     else
225        { if (msync((caddr_t) ad,(size_t) (len+ getpagesize()),MS_SYNC) == -1 )
226                perror("Error cacheflush");} }
227 
228 
229 #include <sys/errno.h>
230 #include <sys/vmuser.h>
231 
vvm_cflush(addr,len)232 vvm_cflush(addr , len)
233 
234 caddr_t addr;
235 int len;
236 
237 {  mycflush(addr , len); }
238