Changeset 252 for trunk/src/slib.c


Ignore:
Timestamp:
Oct 12, 2009, 10:40:45 AM (15 years ago)
Author:
katerina
Message:

Add code to check for stale file records on close() and fclose(), fix sl_close() to handle open stream (ticket #163).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/slib.c

    r248 r252  
    15591559  SL_TICKET ticket;          /* The unique  ID.      */
    15601560  int fd;                    /* The file descriptor. */
     1561  FILE * stream;             /* The file descriptor. */
    15611562  char * path;               /* The file path.       */
    15621563  int flush;                 /* Whether we want to flush the cache */
     
    15711572static int  stale_orig_line = -1;
    15721573static char stale_orig_mesg[128];
     1574
     1575static char badfd_orig_file[64] = { '\0' };
     1576static int  badfd_orig_line = -1;
     1577static char badfd_orig_mesg[128];
    15731578
    15741579SH_MUTEX_STATIC(mutex_ticket, PTHREAD_MUTEX_INITIALIZER);
     
    15871592}
    15881593
     1594char * sl_check_badfd()
     1595{
     1596  if (badfd_orig_line == -1)
     1597    return NULL;
     1598  sl_snprintf(badfd_orig_mesg, sizeof(badfd_orig_mesg),
     1599              _("close on file descriptor with allocated handle, %s, %d"),
     1600              badfd_orig_file, badfd_orig_line);
     1601  badfd_orig_file[0] = '\0';
     1602  badfd_orig_line    = -1;
     1603  return badfd_orig_mesg;
     1604}
     1605
    15891606static
    15901607SL_TICKET sl_create_ticket (unsigned int myindex)
     
    16661683
    16671684SL_TICKET sl_make_ticket (const char * ofile, int oline,
    1668                           int fd, const char * filename)
     1685                          int fd, const char * filename, FILE * stream)
    16691686{
    16701687  size_t    len;
     
    17211738  ofiles[fd]->fd      = fd;
    17221739  ofiles[fd]->content = NULL;
     1740  ofiles[fd]->stream  = stream;
    17231741  ofiles[fd]->flush   = SL_FALSE;
    17241742
     
    17861804   * the mask is returned."
    17871805   */
    1788   (void) umask (0); 
     1806  (void) umask (0);
    17891807
    17901808  if (mode == SL_OPEN_FOR_FASTREAD)
     
    19271945  if (stat_return < 0)
    19281946    {
    1929       close (fd);
     1947      sl_close_fd (FIL__, __LINE__, fd);
    19301948      errno = errval;
    19311949      SL_IRETURN(SL_EFSTAT, _("sl_open_file"));
     
    19361954  if (lstat_return != ENOENT && buf.st_ino != lbuf.st_ino)
    19371955    {
    1938       close (fd);
     1956      sl_close_fd (FIL__, __LINE__, fd);
    19391957      SL_IRETURN(SL_EBOGUS, _("sl_open_file"));
    19401958    }
     
    19461964  if (fd >= MAXFD)
    19471965     {
    1948         close(fd);
     1966        sl_close_fd(FIL__, __LINE__, fd);
    19491967        SL_IRETURN(SL_TOOMANY, _("sl_open_file"));
    19501968     }
     
    19531971    {
    19541972      /*
    1955       close(fd);
     1973      sl_close_fd(FIL__, __LINE__, fd);
    19561974      SL_IRETURN(SL_EINTERNAL09, _("sl_open_file"));
    19571975      */
     
    19681986  if ( (ofiles[fd] = (SL_OFILE *) malloc(sizeof(SL_OFILE))) == NULL)
    19691987    {
    1970       close(fd);
     1988      sl_close_fd(FIL__, __LINE__, fd);
    19711989      SL_IRETURN(SL_EMEM, _("sl_open_file"));
    19721990    }
     
    19781996      free (ofiles[fd]);
    19791997      ofiles[fd] = NULL;
    1980       close(fd);
     1998      sl_close_fd(FIL__, __LINE__, fd);
    19811999      SL_IRETURN(SL_EMEM, _("sl_open_file"));
    19822000    }
     
    19912009      (void) free (ofiles[fd]);
    19922010      ofiles[fd] = NULL;
    1993       close(fd);
     2011      sl_close_fd(FIL__, __LINE__, fd);
    19942012      SL_IRETURN(ticket, _("sl_open_file"));
    19952013    }
     
    19992017  ofiles[fd]->fd      = fd;
    20002018  ofiles[fd]->content = NULL;
     2019  ofiles[fd]->stream  = NULL;
    20012020  ofiles[fd]->flush   = SL_FALSE;
    20022021
     
    20052024
    20062025  SL_IRETURN(ticket, _("sl_open_file"));
     2026}
     2027
     2028FILE * sl_stream (SL_TICKET ticket, char * mode)
     2029{
     2030  int    fd;
     2031
     2032  if (SL_ISERROR(fd = sl_read_ticket(ticket)))
     2033    return (NULL);
     2034
     2035  if (ofiles[fd] == NULL || fd != ofiles[fd]->fd ||
     2036      ticket != ofiles[fd]->ticket || fd < 0)
     2037    return (NULL);
     2038
     2039  if (!ofiles[fd]->stream)
     2040    ofiles[fd]->stream = fdopen(fd, mode);
     2041
     2042  return ofiles[fd]->stream;
    20072043}
    20082044
     
    22592295{
    22602296  register int fd;
     2297  FILE * fp = NULL;
    22612298
    22622299  SL_ENTER(_("sl_close"));
     
    22762313        sh_string_destroy(&(ofiles[fd]->content));
    22772314      (void) free (ofiles[fd]->path);
     2315      fp = ofiles[fd]->stream;
    22782316      (void) free (ofiles[fd]);
    22792317      ofiles[fd] = NULL;
     
    22822320  /* This may fail, but what to do then ?
    22832321   */
    2284   if (0 != close(fd))
    2285     {
    2286       TPT((0, FIL__, __LINE__,
    2287            _("msg=<Error closing file.>, fd=<%d>, err=<%s>\n"),
    2288            fd, strerror(errno)));
     2322  if (fp)
     2323    {
     2324      if (0 != fclose (fp)) /* within sl_close */
     2325        {
     2326          TPT((0, FIL__, __LINE__,
     2327               _("msg=<Error fclosing file.>, fd=<%d>, err=<%s>\n"),
     2328               fd, strerror(errno)));
     2329        }
     2330    }
     2331  else
     2332    {
     2333      if (0 != close(fd)) /* within sl_close */
     2334        {
     2335          TPT((0, FIL__, __LINE__,
     2336               _("msg=<Error closing file.>, fd=<%d>, err=<%s>\n"),
     2337               fd, strerror(errno)));
     2338        }
    22892339    }
    22902340
    22912341  SL_IRETURN(SL_ENONE, _("sl_close"));
     2342}
     2343
     2344int sl_close_fd (const char * file, int line, int fd)
     2345{
     2346  int ret = -1;
     2347
     2348  SL_ENTER(_("sl_close_fd"));
     2349
     2350  if (fd >= 0 && fd < MAXFD && ofiles[fd] != NULL) /* stale ofiles[fd] handle */
     2351    {
     2352      sl_strlcpy(badfd_orig_file, file, sizeof(badfd_orig_file));
     2353      badfd_orig_line = line;
     2354    }
     2355
     2356  ret = close(fd); /* within sl_close_fd wrapper */
     2357
     2358  SL_IRETURN(ret, _("sl_close_fd"));
     2359}
     2360
     2361int sl_fclose (const char * file, int line, FILE * fp)
     2362{
     2363  int ret = -1;
     2364  int fd;
     2365
     2366  SL_ENTER(_("sl_fclose"));
     2367
     2368  fd = fileno(fp);
     2369
     2370  if (fd >= 0 && fd < MAXFD && ofiles[fd] != NULL) /* stale ofiles[fd] handle */
     2371    {
     2372      sl_strlcpy(badfd_orig_file, file, sizeof(badfd_orig_file));
     2373      badfd_orig_line = line;
     2374    }
     2375
     2376  ret = fclose(fp); /* within sl_fclose wrapper */
     2377
     2378  SL_IRETURN(ret, _("sl_fclose"));
    22922379}
    22932380
Note: See TracChangeset for help on using the changeset viewer.