"SfR Fresh" - the SfR Freeware/Shareware Archive 
Member "eas3pkg/eas3llc/datafile.c" of archive eas3pkg_v1.6.3.tar.gz:
As a special service "SfR Fresh" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting with prefixed line numbers.
Alternatively you can here view or download the uninterpreted source code file.
That can be also achieved for any archive member file by clicking within an archive contents listing on the first character of the file(path) respectively on the according byte size field.
1 /*-------------------------------------------------------------------------------------------------------*/
2 /* EAS3 License */
3 /* */
4 /* Copyright (c) 2006 Institut fuer Aerodynamik und Gasdynamik, Universitaet Stuttgart */
5 /* */
6 /* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and */
7 /* associated documentation files (the "Software"), to deal in the Software without restriction, */
8 /* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, */
9 /* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, */
10 /* subject to the following conditions: */
11 /* */
12 /* The above copyright notice and this permission notice shall be included in all copies or substantial */
13 /* portions of the Software. */
14 /* */
15 /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT */
16 /* LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
17 /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER */
18 /* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION */
19 /* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
20 /*-------------------------------------------------------------------------------------------------------*/
21 /* ------------------------------------------------------------------------
22 * project: eas3llc
23 * file: datafile.c
24 * author: David Eller <david.eller@studserv.uni-stuttgart.de>
25 * October 1999
26 * Daniel Meyer 01/2000-07/2000
27 * Kai Augustin 02/2000
28 * ------------------------------------------------------------------------
29 * Routinen, die auf ganzen Dateien (eas3FileStruct) operieren.
30 * ------------------------------------------------------------------------ */
31
32 #include <stdlib.h>
33 #include <stdio.h>
34 #include <string.h>
35 #include <assert.h>
36
37 #include <unistd.h>
38 #include <fcntl.h>
39 #include <errno.h>
40
41 #include "eas3llc.h"
42
43 static eas3FileStruct *fs[EAS3_MAXFILES+1];
44
45 eas3FileStruct *eas3_newFileStruct(const Int32 filenr, eas3Hdr *hdr,
46 const char *filename)
47 {
48 /* ---------------------------------------------------------
49 * Erzeugt eine neue Datenstruktur mit dem uebergebenen
50 * Kennsatz und traegt Dateinamen ein.
51 *
52 * -setzt internen Kennsatzzeiger auf hdr
53 * -erzeugt internen Parameter
54 * -berechnet Parameterlaenge fuer Offsetberechnung
55 *
56 * --------------------------------------------------------- */
57
58 fs[filenr] = (eas3FileStruct *)malloc( sizeof(eas3FileStruct) );
59 if (fs[filenr] == NULL)
60 eas3_printFErr("eas3_newFileStruct(): malloc() fehlgeschlagen.",
61 __FILE__, __LINE__);
62
63 fs[filenr]->hdr = hdr;
64 fs[filenr]->hdrlen = (off_t) hdr->len;
65
66 /* internen Parameter allokieren */
67 fs[filenr]->prm = eas3_newPar(hdr->bform, hdr->ndim1,
68 hdr->ndim2, hdr->ndim3);
69
70 /* Dateinamen eintragen */
71 eas3_setFileName(filenr, filename);
72
73 fs[filenr]->opened = EAS3_CLOSED;
74 fs[filenr]->locked = EAS3_FALSE;
75 fs[filenr]->datalen =
76 (off_t) (fs[filenr]->prm->bytes* fs[filenr]->hdr->npar*
77 fs[filenr]->hdr->nzs);
78
79 if (fs[filenr]->hdr->dform == EAS2)
80 fs[filenr]->datalen += (off_t) (24* fs[filenr]->hdr->npar*
81 fs[filenr]->hdr->nzs);
82
83 return fs[filenr];
84 }
85
86 eas3FileStruct *eas3_getFileStruct(const Int32 filenr)
87 {
88 /* ---------------------------------------------------------
89 * Liefert die zur filenr passende Datenstruktur zurueck
90 * --------------------------------------------------------- */
91
92 /* Check */
93 if (filenr < 0 || filenr > EAS3_MAXFILES)
94 eas3_printFErr("eas3_getFileStruct(): ungueltige Dateinummer.",
95 __FILE__, __LINE__);
96
97 return fs[filenr] ;
98 }
99
100 void eas3_freeFileStruct(const Int32 filenr)
101 {
102 /* ---------------------------------------------------------
103 * Gibt den dynamisch allokiertn Speicher in fs frei.
104 * Nur auf eas3FileStruct* anwenden, die auch mit
105 * eas3_newFileStruct() erzeugt worden sind.
106 * Speicher fuer Pointerstruktur selbst auch freigeben
107 * und Pointer wieder auf NULL setzen
108 * --------------------------------------------------------- */
109
110 eas3FileStruct *workfs;
111
112 /* Check */
113 if (filenr < 0 || filenr > EAS3_MAXFILES)
114 eas3_printFErr("eas3_closeFile(): ungueltige Dateinummer.",
115 __FILE__, __LINE__);
116
117 workfs=fs[filenr];
118
119 eas3_checknull(workfs, __FILE__, __LINE__);
120
121 /* Interner Parameter ist dynamisch allokiert */
122 eas3_freePar(&workfs->prm);
123
124 free(workfs);
125
126 /* Pointer auf NULL setzen, zum Zeichen dass der Speicher wieder frei ist */
127 workfs=NULL;
128
129 fs[filenr]=workfs;
130
131 }
132
133 void eas3_closeFile(const Int32 filenr)
134 {
135 /* ---------------------------------------------------------
136 * Schliesst zugehoerige Datei, falls moeglich.
137 * --------------------------------------------------------- */
138
139 eas3FileStruct *workfs ;
140
141 if (filenr < 0 || filenr > EAS3_MAXFILES)
142 eas3_printFErr("eas3_closeFile(): ungueltige Dateinummer.",
143 __FILE__, __LINE__);
144
145 /* FS holen */
146 workfs = eas3_getFileStruct(filenr) ;
147
148 /* Keine ge-lock-ten files schliessen. */
149 if (workfs->locked)
150 eas3_printFErr(
151 "eas3_closeFile(): Kann Datei nicht schliessen (noch benutzt).",
152 __FILE__, __LINE__);
153
154 if ( workfs->opened == EAS3_CLOSED )
155 /* Schon geschlossen. Na prima. */
156 return;
157 else
158 {
159 if ( fclose(workfs->fp) == 0 )
160 {
161 workfs->opened = EAS3_CLOSED;
162 workfs->fp = NULL;
163 workfs->fdes = -1;
164 /* Speicherbereich fuer fs freigeben */
165 eas3_freeFileStruct(filenr) ;
166 return;
167 }
168 else
169 eas3_printFErr("eas3_closeFile(): fclose() fehlgeschlagen.",
170 __FILE__, __LINE__);
171 }
172
173 /* Zuletzt Speicherbereich fuer fs wieder freigeben */
174
175
176
177 }
178
179 void eas3_removeFile(const Int32 filenr)
180 {
181 /* ---------------------------------------------------------
182 * Loescht die zugehoerige Datei.
183 * --------------------------------------------------------- */
184
185 eas3FileStruct *workfs ;
186 char filename[256] ;
187
188 if (filenr < 0 || filenr > EAS3_MAXFILES)
189 eas3_printFErr("eas3_removeFile(): ungueltige Dateinummer.",
190 __FILE__, __LINE__);
191
192 workfs = eas3_getFileStruct(filenr) ;
193
194 /* Dateiname setzen */
195 strcpy(filename,workfs->fname) ;
196 /* Datei schliessen, dabei wird Kennsatz geloescht !!! */
197 eas3_closeFile(filenr);
198 /* Datei loeschen */
199 if (remove(filename) == EAS3_FAILURE)
200 eas3_printFErr("eas3_removeFile(): Datei kann nicht geloescht werden.",
201 __FILE__, __LINE__);
202
203 }
204
205
206 Int32 eas3_lockFile(const Int32 filenr)
207 {
208 /* ---------------------------------------------------------
209 * legt ein Advisory Lock auf die Datei des Datenfiles.
210 * Falls ein anderer Prozess ein lock unterhaelt, wird solange
211 * gewartet, bis dieses aufgehoben wird.
212 * --------------------------------------------------------- */
213
214 struct flock lock;
215 eas3FileStruct *workfs ;
216
217 if (filenr < 0 || filenr > EAS3_MAXFILES)
218 eas3_printFErr("eas3_lockFile(): ungueltige Dateinummer.",
219 __FILE__, __LINE__);
220
221 /* FS holen */
222 workfs = eas3_getFileStruct(filenr) ;
223
224
225 /* System - Lock setzen */
226 if (workfs->opened == EAS3_RO)
227 lock.l_type = F_RDLCK;
228 else if (workfs->opened == EAS3_CLOSED)
229 eas3_printFErr("eas3_lockFile(): Kann geschlossene Datei nicht locken.",
230 __FILE__,__LINE__);
231 else
232 lock.l_type = F_WRLCK;
233
234 lock.l_whence = SEEK_SET;
235 lock.l_start = (off_t) 0;
236 /* len = 0 : Bis zum Ende der Datei */
237 lock.l_len = (off_t) 0;
238
239 if (fcntl(workfs->fdes, F_SETLKW, &lock) != EAS3_FAILURE)
240 return EAS3_SUCCESS;
241 else
242 eas3_printFErr("eas3_lockFile(): fcntl() fehlgeschlagen. (Deadlock?)",
243 __FILE__, __LINE__);
244
245 return EAS3_FAILURE;
246 }
247
248
249 Int32 eas3_unlockFile(const Int32 filenr)
250 {
251 /* ---------------------------------------------------------
252 * Entfernt Lock auf fs->fname
253 * --------------------------------------------------------- */
254
255 struct flock lock;
256 eas3FileStruct *workfs ;
257
258 if (filenr < 0 || filenr > EAS3_MAXFILES)
259 eas3_printFErr("eas3_unlockFile(): ungueltige Dateinummer.",
260 __FILE__, __LINE__);
261
262 /* FS holen */
263 workfs = eas3_getFileStruct(filenr) ;
264
265 /* System - Lock aufheben*/
266
267 lock.l_type = F_UNLCK;
268 lock.l_whence = SEEK_SET;
269 lock.l_start = (off_t) 0;
270 /* len = 0 : Bis zum Ende der Datei */
271 lock.l_len = (off_t) 0;
272
273 if (fcntl(workfs->fdes, F_SETLKW, &lock) != EAS3_FAILURE)
274 return EAS3_SUCCESS;
275 else
276 eas3_printFErr("eas3_unlockFile(): fcntl() fehlgeschlagen.",
277 __FILE__, __LINE__);
278
279 return EAS3_FAILURE;
280
281 }
282