modules/ut/fdwrap.c

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. fdwrap_close
  2. fdwrap_fclose

   1 /******************
   2   Copyright (c) 2001,2002                         RIPE NCC
   3  
   4   All Rights Reserved
   5   
   6   Permission to use, copy, modify, and distribute this software and its
   7   documentation for any purpose and without fee is hereby granted,
   8   provided that the above copyright notice appear in all copies and that
   9   both that copyright notice and this permission notice appear in
  10   supporting documentation, and that the name of the author not be
  11   used in advertising or publicity pertaining to distribution of the
  12   software without specific, written prior permission.
  13   
  14   THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  15   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
  16   AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
  17   DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
  18   AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  19   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  20   ***************************************/
  21 
  22 #if 0
  23 We have received errors both from select() and fcntl() claiming that 
  24 they were called on bad file descriptors in "impossible" situations.
  25 The theory is that some other thread has closed the file descriptor.
  26 This can happen, for instance, if another thread attempts to call
  27 close() twice on the same integer.  For example:
  28 
  29    ret_val = 0;
  30    connect(fd, &addr, sizeof(addr));
  31      .
  32      .
  33      .
  34    if (error) {
  35        close(fd);
  36        ret_val = -1;
  37        goto get_out;
  38    }
  39      .
  40      .
  41      .
  42    get_out:
  43        close(fd);          /* OOOPS!!!  Bogus second call to close() */
  44        return ret_val;
  45 
  46 In an effort to detect this condition, we introduce this wrapper, which
  47 sets the file descriptor to -1 (an illegal file number) while closing.  
  48 This means that subsequent calls can detect the -1 value and issue an
  49 appropriate warning.
  50 
  51 Shane, 2001-07-02
  52 #endif /* 0 */
  53 
  54 #include "rip.h"
  55 
  56 #include <unistd.h>
  57 #include <stdio.h>
  58 #include <errno.h>
  59 
  60 /* undefine our wrappers so we can use the real functions */
  61 #undef close
  62 #undef fclose
  63 
  64 int 
  65 fdwrap_close (int *fd, const char *file, int line)
     /* [<][>][^][v][top][bottom][index][help] */
  66 {
  67     int open_fd;
  68 
  69     /* save the passed file descriptor, and set to -1 */
  70     open_fd = *fd;
  71     *fd = -1;
  72 
  73     /* check to see if we've closed this already */
  74     if (open_fd < 0) {
  75         /* report error */
  76         ER_perror(FAC_UT, UT_DUPCLOSE, 
  77             "close() called on closed file descriptor from %s:%d",
  78             file, line);
  79 
  80         /* return error */
  81         errno = EBADF;
  82         return -1;
  83     } else {
  84         /* the usual case, call close() */
  85         return close(open_fd);
  86     }
  87 }
  88 
  89 int 
  90 fdwrap_fclose (FILE **fp, const char *file, int line)
     /* [<][>][^][v][top][bottom][index][help] */
  91 {
  92     FILE *open_fp;
  93 
  94     /* save the passed file handle, and set to NULL */
  95     open_fp = *fp;
  96     *fp = NULL;
  97 
  98     /* check to see if we've closed this already */
  99     if (open_fp == NULL) {
 100         /* report error */
 101         ER_perror(FAC_UT, UT_DUPCLOSE,
 102             "fclose() called on closed file handle from %s:%d",
 103             file, line);
 104 
 105         /* return error */
 106         errno = EBADF;
 107         return EOF;
 108     } else {
 109         /* the usual case, call fclose() */
 110         return fclose(open_fp);
 111     }
 112 }
 113 

/* [<][>][^][v][top][bottom][index][help] */