/[MITgcm]/MITgcm/tools/mpack-1.6/unixos.c
ViewVC logotype

Annotation of /MITgcm/tools/mpack-1.6/unixos.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.2 - (hide annotations) (download)
Tue Nov 23 15:52:35 2004 UTC (19 years, 5 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint58l_post, checkpoint57t_post, checkpoint57o_post, checkpoint58e_post, mitgcm_mapl_00, checkpoint58u_post, checkpoint58w_post, checkpoint57m_post, checkpoint57s_post, checkpoint57k_post, checkpoint57d_post, checkpoint57g_post, checkpoint57b_post, checkpoint57c_pre, checkpoint58r_post, checkpoint56b_post, checkpoint57i_post, checkpoint57y_post, checkpoint57e_post, checkpoint58n_post, checkpoint58x_post, checkpoint57g_pre, checkpoint58t_post, checkpoint58h_post, checkpoint56c_post, checkpoint57y_pre, checkpoint57f_pre, checkpoint57a_post, checkpoint58q_post, checkpoint57v_post, checkpoint58j_post, checkpoint59e, checkpoint59d, checkpoint59g, checkpoint59f, checkpoint59a, checkpoint59c, checkpoint59b, checkpoint59m, checkpoint59l, checkpoint59n, checkpoint59i, checkpoint59h, checkpoint59k, checkpoint59j, checkpoint57r_post, checkpoint59, checkpoint58, checkpoint57a_pre, checkpoint57, eckpoint57e_pre, checkpoint57h_done, checkpoint58f_post, checkpoint57x_post, checkpoint57n_post, checkpoint58d_post, checkpoint58c_post, checkpoint57w_post, checkpoint57p_post, checkpint57u_post, checkpoint57f_post, checkpoint58a_post, checkpoint58i_post, checkpoint57q_post, checkpoint58g_post, checkpoint58o_post, checkpoint57z_post, checkpoint57c_post, checkpoint58y_post, checkpoint58k_post, checkpoint58v_post, checkpoint58s_post, checkpoint58p_post, checkpoint57j_post, checkpoint58b_post, checkpoint57h_pre, checkpoint58m_post, checkpoint57l_post, checkpoint57h_post, checkpoint56a_post
Changes since 1.1: +2 -2 lines
File MIME type: text/plain
 o fix malloc typecasting for newer/stricter compilers (eg. GCC 3.4.2)

1 edhill 1.1 /* (C) Copyright 1993,1994 by Carnegie Mellon University
2     * All Rights Reserved.
3     *
4     * Permission to use, copy, modify, distribute, and sell this software
5     * and its documentation for any purpose is hereby granted without
6     * fee, provided that the above copyright notice appear in all copies
7     * and that both that copyright notice and this permission notice
8     * appear in supporting documentation, and that the name of Carnegie
9     * Mellon University not be used in advertising or publicity
10     * pertaining to distribution of the software without specific,
11     * written prior permission. Carnegie Mellon University makes no
12     * representations about the suitability of this software for any
13     * purpose. It is provided "as is" without express or implied
14     * warranty.
15     *
16     * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
17     * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18     * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
19     * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
20     * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
21     * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
22     * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
23     * SOFTWARE.
24     */
25     #include <stdio.h>
26     #include <ctype.h>
27     #include <string.h>
28     #include <errno.h>
29     #include <sys/types.h>
30     #include <sys/param.h>
31     #include <netdb.h>
32     #include <fcntl.h>
33     #include "xmalloc.h"
34     #include "common.h"
35     #include "part.h"
36    
37     #ifndef MAXHOSTNAMELEN
38     #define MAXHOSTNAMELEN 64
39     #endif
40    
41     extern int errno;
42 edhill 1.2 /* extern char *malloc(); */
43 edhill 1.1 extern char *getenv();
44    
45     int overwrite_files = 0;
46     int didchat;
47    
48     /* The name of the file we're writing */
49     static char *output_fname = 0;
50    
51     /* Characters that shouldn't be in filenames */
52     #define BADCHARS "!$&*()|\'\";<>[]{}?/`\\ \t"
53    
54     /* Generate a message-id */
55     char *os_genid(void)
56     {
57     static int pid = 0;
58     static time_t curtime;
59     static char hostname[MAXHOSTNAMELEN+1];
60     char *result;
61     struct hostent *hp;
62    
63    
64     if (pid == 0) {
65     pid = getpid();
66     time(&curtime);
67     gethostname(hostname, sizeof(hostname));
68    
69     /* If we don't have a FQDN, try canonicalizing with gethostbyname */
70     if (!strchr(hostname, '.')) {
71     hp = gethostbyname(hostname);
72     if (hp) {
73     strcpy(hostname, hp->h_name);
74     }
75     }
76     }
77    
78 edhill 1.2 result = (char *)malloc(25+strlen(hostname));
79 edhill 1.1 sprintf(result, "%d.%d@%s", pid, curtime++, hostname);
80     return result;
81     }
82    
83     /* Create and return directory for a message-id */
84     char *os_idtodir(char *id)
85     {
86     static char buf[4096];
87     char *p;
88    
89     if (getenv("TMPDIR")) {
90     strcpy(buf, getenv("TMPDIR"));
91     }
92     else {
93     strcpy(buf, "/usr/tmp");
94     }
95     strcat(buf, "/m-prts-");
96     p = getenv("USER");
97     if (!p) p = getenv("LOGNAME");
98     if (!p) p = "x";
99     strcat(buf, p);
100    
101     (void)mkdir(buf, 0700);
102    
103     p = buf + strlen(buf);
104     *p++ = '/';
105     while (*id && p < buf+sizeof(buf)-10 ) {
106     if (isprint(*id) && !strchr(BADCHARS, *id)) *p++ = *id;
107     id++;
108     }
109     *p = '\0';
110     if (mkdir(buf, 0700) == -1 && errno != EEXIST) {
111     perror(buf);
112     return 0;
113     }
114     *p++ = '/';
115     *p = '\0';
116     return buf;
117     }
118    
119     /*
120     * We are done with the directory returned by os_idtodir()
121     * Remove it
122     */
123     void os_donewithdir(char *dir)
124     {
125     char *p;
126    
127     /* Remove trailing slash */
128     p = dir + strlen(dir) - 1;
129     *p = '\0';
130    
131     rmdir(dir);
132     }
133    
134     FILE *os_createnewfile(char *fname)
135     {
136     int fd;
137     FILE *ret;
138    
139     #ifdef O_EXCL
140     fd=open(fname, O_RDWR|O_CREAT|O_EXCL, 0644);
141     #else
142     fd=open(fname, O_RDWR|O_CREAT|O_TRUNC, 0644);
143     #endif
144    
145     if (fd == -1)
146     return NULL;
147    
148     ret=fdopen(fd, "w");
149     return ret;
150     }
151    
152    
153     /*
154     * Create a new file, with suggested filename "fname".
155     * "fname" may have come from an insecure source, so clean it up first.
156     * It may also be null.
157     * "contentType" is passed in for use by systems that have typed filesystems.
158     * "flags" contains a bit pattern describing attributes of the new file.
159     */
160     FILE *os_newtypedfile(char *fname, char *contentType, int flags, params contentParams)
161     {
162     char *p;
163     static int filesuffix=0;
164     char buf[128], *descfname=0;
165     FILE *outfile = 0;
166    
167     if (!fname) fname = "";
168    
169     /* If absolute path name, chop to tail */
170     if (*fname == '/') {
171     p = strrchr(fname, '/');
172     fname = p+1;
173     }
174    
175     /* Get rid of leading ~ or ~/ */
176     while (*fname == '~' || *fname == '/') fname++;
177    
178     while (!strncmp(fname, "../", 3)) fname += 3;
179    
180     /* Clean out bad characters, create directories along path */
181     for (p=fname; *p; p++) {
182     if (*p == '/') {
183     if (!strncmp(p, "/../", 4)) {
184     p[1] = p[2] = 'X';
185     }
186     *p = '\0';
187     (void) mkdir(fname, 0777);
188     *p = '/';
189     }
190     else if (!isprint(*p) || strchr(BADCHARS, *p)) *p = 'X';
191     }
192    
193     if (!fname[0]) {
194     do {
195     if (outfile) fclose(outfile);
196     sprintf(buf, "part%d", ++filesuffix);
197     } while (outfile = fopen(buf, "r"));
198     fname = buf;
199     }
200     else if (!overwrite_files && (outfile = fopen(fname, "r"))) {
201     do {
202     fclose(outfile);
203     sprintf(buf, "%s.%d", fname, ++filesuffix);
204    
205     } while (outfile = fopen(buf, "r"));
206     fname = buf;
207     }
208    
209     if (overwrite_files)
210     outfile = fopen(fname, "w");
211     else
212     outfile = os_createnewfile(fname);
213    
214     if (!outfile) {
215     perror(fname);
216     }
217    
218     if (output_fname) free(output_fname);
219     output_fname = strsave(fname);
220    
221     if (strlen(fname) > sizeof(buf)-6) {
222     descfname = xmalloc(strlen(fname)+6);
223     }
224     else {
225     descfname = buf;
226     }
227     strcpy(descfname, fname);
228    
229     p = strchr(descfname, '/');
230     if (!p) p = descfname;
231     if (p = strrchr(p, '.')) *p = '\0';
232    
233     strcat(descfname, ".desc");
234     (void) rename(TEMPFILENAME, descfname);
235     if (descfname != buf) free(descfname);
236    
237     fprintf(stdout, "%s (%s)\n", output_fname, contentType);
238     didchat = 1;
239    
240     return outfile;
241     }
242    
243     /*
244     * Close a file opened by os_newTypedFile()
245     */
246     void os_closetypedfile(FILE *outfile)
247     {
248     fclose(outfile);
249     }
250    
251     /*
252     * (Don't) Handle a BinHex'ed file
253     */
254     int
255     os_binhex(struct part *inpart, int part, int nparts)
256     {
257     return 1;
258     }
259    
260     /*
261     * Warn user that the MD5 digest of the last file created by os_newtypedfile()
262     * did not match that supplied in the Content-MD5: header.
263     */
264     void os_warnMD5mismatch(void)
265     {
266     char *warning;
267    
268     warning = xmalloc(strlen(output_fname) + 100);
269     sprintf(warning, "%s was corrupted in transit",
270     output_fname);
271     warn(warning);
272     free(warning);
273     }
274    
275     /*
276     * Report an error (in errno) concerning a filename
277     */
278     void os_perror(char *file)
279     {
280     perror(file);
281     }

  ViewVC Help
Powered by ViewVC 1.1.22