"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