1 #include <stdio.h>
2 #ifdef macintosh
3 #include <unix.h>
4 #include <unistd.h>
5 #else
6 #if defined(WIN32) && ! defined(__CYGWIN__)
7 #include <io.h>
8 #else
9 #include <sys/types.h>
10 #endif
11 #include <sys/stat.h>
12 #endif
13 #include <fcntl.h>
14 #include "lt-defs.h"
15 #include "string16.h"
16 #include "lt-comment.h"
17 #include "lt-safe.h"
18 
19 #ifdef HAVE_LIBZ
20 #include "zlib.h"
21 #endif
22 
23 #include <errno.h>
24 
25 /* to avoid applications having to know about errno, or use libg++ */
26 /* Why aren't we using strerror(errno)????*/
strErr(void)27 const char *strErr( void ) {
28 #ifdef macintosh
29   return "Macs don't have sys_errlist";
30 #elif defined(__CYGWIN__)
31   return strerror(errno);
32 #else
33   return sys_errlist[errno];
34 #endif
35 }
36 
37 /* Open a filename */
38 
s_open(const char * path,int flags,int mode)39 int s_open(const char *path,int flags,int mode) {
40   int val;
41 #ifdef macintosh
42   /* then the three argument form of open cannot be used
43      have to settle for ignoring mode.
44    */
45   val=(flags&O_CREAT) ?open(path,flags):open(path,flags);
46 #else
47   val=(flags&O_CREAT)?open(path,flags,mode):open(path,flags);
48 #endif
49   if (val==EOF) {
50     LT_ERROR2(LEFILE,"Couldn't open file %s: %s\n",
51 	   path,strErr());
52   };
53   return val;
54 }
55 
sfopen(const char * name,const char * mode)56 FILE *sfopen(const char *name,const char *mode) {
57   FILE *filep;
58 
59   if((filep=fopen(name,mode))==NULL) {
60     LT_ERROR2(LEFILE,"Couldn't open file %s: %s\n",
61 	   name,strErr());
62   };
63   return filep;
64 }
65 
stdsfopen(const char * filename,const char * mode)66 FILE *stdsfopen(const char *filename,const char *mode) {
67   FILE *filep;
68   int length;
69 #ifndef HAVE_LIBZ
70 #ifdef HAVE_POPEN
71   char string[MAXFILENAMELEN+20];
72 #endif
73 #endif
74 
75   if (filename==NULL) {
76     LT_ERROR(LENULA,"Call to stdsfopen made without instantiated filename.\n");
77     return NULL;
78   };
79   if (mode==NULL) {
80     LT_ERROR(LENULA,"Call to stdsfopen made without instantiated mode.\n");
81     return NULL;
82   };
83 
84   length=strlen8(filename);
85 
86   if(strcmp8(filename,"stdin")==0)
87     return stdin;
88   if(strcmp8(filename,"stdout")==0)
89     return stdout;
90   if(strcmp8(filename,"stderr")==0)
91     return stderr;
92 
93 #ifndef HAVE_LIBZ
94   if (((length>2) && (!strcmp8(filename+length-2,".Z"))) ||
95       ((length>3) && (!strcmp8(filename+length-3,".gz")))) {
96 #ifdef HAVE_POPEN
97     if(mode[0] == 'r') {
98       sprintf(string,"gunzip -c %s",filename);
99       filep=popen(string, "r");
100     } else if (mode[0] == 'w') {
101       sprintf(string,"gzip -c > %s", filename);
102       filep=popen(string,"w");
103     } else {
104 #endif /* HAVE_POPEN */
105       LT_ERROR2(LEFILE,"Couldn't deal with %s (compressed) in mode %s\n",
106 	     filename,mode);
107       return NULL;
108 #ifdef HAVE_POPEN
109     };
110     if (!filep) {
111       LT_ERROR1(LESYSE,"Couldn't open pipe: %s\n",string);
112       return NULL;
113     };
114 #endif /* HAVE_POPEN */
115   }
116   else
117 #endif /* HAVE_LIBZ*/
118   if ((!strcmp8(filename,"")) || (!strcmp8(filename,"-"))) {
119     if(mode[0] == 'r')
120       filep=stdin;
121     else if(mode[0] == 'w')
122       filep=stdout;
123     else {
124       LT_ERROR1(LEFILE,"FATAL: std*** implied in illegal mode %s\n",mode);
125       return NULL;
126     };
127   }
128   else {
129     filep=fopen(filename,mode);
130   };
131 
132   if(filep==NULL) {
133     LT_ERROR2(LEFILE,"Couldn't open file %s: %s\n", filename, strErr());
134   };
135 
136   return filep;
137 }
138 
file_len(int fd)139 int file_len(int fd) {
140   struct stat stat_buf;
141   if(fstat(fd, &stat_buf) != -1) {
142     return(stat_buf.st_size);
143   };
144   LT_ERROR1(LEFILE,"Couldn't stat file: %s",strErr());
145   return -1;
146 }
147 
file_length(const FILE * fd)148 int file_length(const FILE *fd) {
149 #ifdef HAVE_FILENO
150   return file_len(fileno((FILE *)fd));
151 #else
152   LT_ERROR(LEFILE,"fileno not supported by this architecture\n");
153   return 0;
154 #endif
155 }
156 
slseek(int fd,off_t offset,int whence,const char * filename)157 off_t slseek(int fd, off_t offset, int whence, const char *filename) {
158   off_t val;
159   if ((val=lseek(fd, offset, whence))==EOF) {
160     LT_ERROR2(LEFILE,"Unable to seek %s: %s",filename,strErr());
161   };
162   return val;
163 }
164 
sftell(const FILE * f,const char * filename)165 off_t sftell(const FILE *f,const char *filename) {
166   off_t val;
167   if ((val=ftell((FILE*)f))==EOF) {
168     LT_ERROR2(LEFILE,"Unable to ftell %s: %s",filename,strErr());
169   };
170   return val;
171 }
172 
sfseek(FILE * f,off_t pos,const char * filename)173 off_t sfseek(FILE *f,off_t pos,const char *filename) {
174   off_t val;
175   if ((val=fseek(f,pos,SEEK_SET))==EOF) {
176     LT_ERROR2(LEFILE,"Unable to fseek %s: %s",filename,strErr());
177   };
178   return val;
179 }
180 
sfflush(FILE * filep)181 int sfflush(FILE *filep) {
182   if (fflush(filep)==EOF) {
183     LT_ERROR1(LEWRTF,"fflush failed: %s\n",strErr());
184     return EOF;
185   };
186   return 0;
187 }
188 
sfclose(FILE * filep)189 int sfclose(FILE *filep) {
190   if (fclose(filep)==EOF) {
191     LT_ERROR1(LEWRTF,"fclose failed: %s\n",strErr());
192     return EOF;
193   };
194   return 0;
195 }
196 
stdfclose(FILE * filep)197 int stdfclose(FILE *filep) {
198   if(filep==stdin || filep==stdout || filep==stderr) {
199     return sfflush(filep);
200   }
201   else {
202     return sfclose(filep);
203   };
204 }
205 
sfdopen(int fd,const char * mode)206 FILE *sfdopen(int fd, const char *mode) {
207 #ifdef HAVE_FDOPEN
208   FILE *file;
209 
210   if((file=fdopen(fd,(char *)mode))==NULL) {
211     /* not clear if fdopen failures set ERRNO */
212     LT_ERROR1(LEFILE,"Failed to assign stream to file %d\n",fd);
213   };
214 
215   return file;
216 #else
217   LT_ERROR(LEFILE,"sfdopen not supported for this architecture %d\n");
218   return 0;
219 #endif
220 }
221 
sread(int fd,char * buf,int nbyte)222 int sread(int fd, char *buf, int nbyte) {
223   int val;
224   if ((val=read(fd,buf,nbyte))==EOF) {
225     LT_ERROR1(LERDF,"read failed: %s\n",strErr());
226     return EOF;
227   }
228   else {
229     return val;
230   };
231 }
232 
sputc(char c,FILE * stream)233 int sputc(char c, FILE *stream) {
234   if (putc(c,stream)==EOF) {
235     LT_ERROR1(LEWRTF,"putc failed: %s\n",strErr());
236     return EOF;
237   }
238   else {
239     return c;
240   };
241 }
242 
sfputs(const char * s,FILE * stream)243 int sfputs(const char *s, FILE *stream) {
244   int val;
245   if ((val=(fputs(s,stream)))==EOF) {
246     LT_ERROR1(LEWRTF,"puts failed: %s\n",strErr());
247   };
248   return val;
249 }
250 
sputw(int w,FILE * stream)251 int sputw(int w, FILE *stream) {
252 #ifdef HAVE_PUTW
253   if (putw(w,stream)) {
254 #else
255   if (fwrite(&w,sizeof(int),1,stream) != 1) {
256 #endif
257     /* putw returns 1 on failure */
258     LT_ERROR(LEWRTF,"sputw failed\n");
259     return EOF;
260   } else {
261     return 0;
262   }
263 }
264 
265 int sfwrite(const void* ptr, int size, int nitems, FILE* stream) {
266   int val;
267 
268   if ((val=fwrite(ptr, size, nitems, stream))==0 &&
269       (size>0) &&
270       (nitems>0)) {
271     LT_ERROR1(LEWRTF,"sfwrite failed: %s\n",strErr());
272     return EOF;
273   }
274   else {
275     return val;
276   };
277 }
278 
279 int sfprintf(FILE *stream, const char *format, ...) {
280   va_list args;
281   int retval;
282 
283   va_start(args, format);
284   retval = vfprintf(stream, format, args);
285   va_end(args);
286   if(retval == EOF) {
287     LT_ERROR1(LEWRTF,"sfprintf failed: %s\n",strErr());
288   }
289   return retval;
290 }
291 
292 int sFprintf(FILE16 *stream, const char *format, ...) {
293   va_list args;
294   int retval;
295 
296   va_start(args, format);
297   retval = Vfprintf(stream, format, args);
298   va_end(args);
299   if(retval == EOF) {
300     LT_ERROR1(LEWRTF,"sFprintf failed: %s\n",strErr());
301   }
302   return retval;
303 }
304 
305 int sFflush(FILE16 *filep) {
306   if (Fflush(filep)==EOF) {
307     LT_ERROR1(LEWRTF,"fflush failed: %s\n",strErr());
308     return EOF;
309   };
310   return 0;
311 }
312 
313 /* XXX improve these!!! */
314 
315 int sPutc(Char c, FILE16 *stream)
316 {
317     Char buf[2];
318     buf[0] = c; buf[1] = 0;
319     return sFprintf(stream, "%S", buf);
320 }
321 
322 int sFputs(const Char *s, FILE16 *stream)
323 {
324     return sFprintf(stream, "%S", s);
325 }
326 
327