pdir.c
上传用户:tany51
上传日期:2013-06-12
资源大小:1397k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 2001  Dizzy (dizzy@roedu.net)
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  */
  18. #define PDIR_INTERNAL_ACCESS
  19. #include "common/setup_before.h"
  20. #ifdef HAVE_STDDEF_H
  21. # include <stddef.h>
  22. #else
  23. # ifndef NULL
  24. #  define NULL ((void *)0)
  25. # endif
  26. #endif
  27. #ifdef STDC_HEADERS
  28. # include <stdlib.h>
  29. #else
  30. # ifdef HAVE_MALLOC_H
  31. #  include <malloc.h>
  32. # endif
  33. #endif
  34. #ifdef HAVE_SYS_TYPES_H
  35. # include <sys/types.h>
  36. #endif
  37. #ifdef HAVE_STRING_H
  38. # include <string.h>
  39. #else
  40. # ifdef HAVE_STRINGS_H
  41. #  include <strings.h>
  42. # endif
  43. #endif
  44. #include "compat/strdup.h"
  45. #ifdef HAVE_DIRENT_H
  46. # include <dirent.h>
  47. #else
  48. # ifdef HAVE_SYS_NDIR_H
  49. #  include <sys/ndir.h>
  50. # endif
  51. # if HAVE_SYS_DIR_H
  52. #  include <sys/dir.h>
  53. # endif
  54. # if HAVE_NDIR_H
  55. #  include <ndir.h>
  56. # endif
  57. # define dirent direct
  58. #endif
  59. #ifdef WIN32
  60. # include <io.h> /* for _findfirst(), _findnext(), etc */
  61. #endif
  62. #include <errno.h>
  63. #include "compat/strerror.h"
  64. #include "common/eventlog.h"
  65. #include "pdir.h"
  66. #include "common/setup_after.h"
  67. extern t_pdir * p_opendir(const char * path) {
  68. #ifdef WIN32
  69.    char npath[_MAX_PATH];
  70. #endif
  71.    t_pdir * pdir;
  72.    
  73.    if (path==NULL) {
  74.       eventlog(eventlog_level_error,"p_opendir","got NULL path");
  75.       return NULL;
  76.    }
  77. /*   while(path[strlen(path)]=='/') path[strlen(path)]=''; */
  78.    /* win32 can use slash in addition to backslash  */
  79.    if ((pdir=malloc(sizeof(t_pdir)))==NULL) {
  80.       eventlog(eventlog_level_error,"p_opendir","not enough memory for pdir");
  81.       return NULL;
  82.    }
  83.     
  84. #ifdef WIN32
  85.    if (strlen(path)+1+3+1>_MAX_PATH) {
  86.       eventlog(eventlog_level_error,"p_opendir","WIN32: path too long");
  87.       free(pdir);
  88.       return NULL;
  89.    }
  90.    strcpy(npath, path);
  91.    strcat(npath, "/*.*");
  92.    if (!(pdir->path=strdup(npath)))
  93.    {
  94.       eventlog(eventlog_level_error,"p_opendir","WIN32: could not allocate memory for path");
  95.       free(pdir);
  96.       return NULL;
  97.    }
  98.    
  99.    pdir->status = 0;
  100.    memset(&pdir->fileinfo, 0, sizeof(pdir->fileinfo)); /* no need for compat because WIN32 always has memset() */
  101.    pdir->lFindHandle = _findfirst(npath, &pdir->fileinfo);
  102.    if (pdir->lFindHandle < 0) {
  103.       eventlog(eventlog_level_error,"p_opendir","WIN32: unable to open directory "%s" for reading (_findfirst: %s)",npath,strerror(errno));
  104.       free((void *)pdir->path); /* avoid warning */
  105.       free(pdir);
  106.       return NULL;
  107.    }
  108. #else /* POSIX style */
  109.    if (!(pdir->path=strdup(path)))
  110.    {
  111.       eventlog(eventlog_level_error,"p_opendir","POSIX: unable to allocate memory for path");
  112.       free(pdir);
  113.       return NULL;
  114.    }
  115.    if ((pdir->dir=opendir(path))==NULL) {
  116.       eventlog(eventlog_level_error,"p_opendir","POSIX: unable to open directory "%s" for reading (opendir: %s)",path,strerror(errno));
  117.       free((void *)pdir->path); /* avoid warning */
  118.       free(pdir);
  119.       return NULL;
  120.    }
  121.    
  122. #endif /* WIN32-POSIX */
  123.    
  124.    eventlog(eventlog_level_debug,"p_opendir","successfully opened dir: %s",path);
  125.    return pdir;
  126. }
  127. extern int p_rewinddir(t_pdir * pdir) {
  128.    if (pdir==NULL) {
  129.       eventlog(eventlog_level_error,"p_rewinddir","got NULL pdir");
  130.       return -1;
  131.    }
  132.    if (pdir->path==NULL) {
  133.       eventlog(eventlog_level_error,"p_rewinddir","got pdir with NULL path");
  134.       return -1;
  135.    }
  136. #ifdef WIN32
  137.    /* i dont have any win32 around so i dont know if io.h has any rewinddir equivalent */
  138.    /* FIXME: for the time being ill just close and reopen it */
  139.    if (pdir->status!=-1)
  140.    {
  141.        if (pdir->lFindHandle<0) {
  142.    eventlog(eventlog_level_error,"p_rewinddir","WIN32: got negative lFindHandle");
  143.    return -1;
  144.        }
  145.        _findclose(pdir->lFindHandle);
  146.    }
  147.    pdir->status = 0;
  148.    memset(&pdir->fileinfo, 0, sizeof(pdir->fileinfo)); /* no need for compat because WIN32 always has memset() */
  149.    pdir->lFindHandle = _findfirst(pdir->path, &pdir->fileinfo);
  150.    if (pdir->lFindHandle < 0) {
  151.       eventlog(eventlog_level_error,"p_rewinddir","WIN32: unable to open directory "%s" for reading (_findfirst: %s)",pdir->path,strerror(errno));
  152.       pdir->status = -1;
  153.       return -1;
  154.    }
  155. #else /* POSIX */
  156.    if (pdir->dir==NULL) {
  157.       eventlog(eventlog_level_error,"p_rewinddir","POSIX: got pdir with NULL dir");
  158.       return -1;
  159.    }
  160.    rewinddir(pdir->dir);
  161. #endif
  162.    return 0;
  163. }
  164. extern char const * p_readdir(t_pdir * pdir) {
  165.    if (pdir==NULL) {
  166.       eventlog(eventlog_level_error,"p_readdir","got NULL pdir");
  167.       return NULL;
  168.    }
  169.    if (pdir->path==NULL) {
  170.       eventlog(eventlog_level_error,"p_readdir","got pdir with NULL path");
  171.       return NULL;
  172.    }
  173. #ifdef WIN32
  174.    switch (pdir->status)
  175.    {
  176.    default:
  177.    case -1: /* couldn't rewind */
  178.        eventlog(eventlog_level_error,"p_readdir","got pdir with status -1");
  179.        return NULL;
  180.    case 0: /* freshly opened */
  181.        pdir->status = 1;
  182.        return pdir->fileinfo.name;
  183.    case 1: /* reading */
  184.        if (_findnext(pdir->lFindHandle, &pdir->fileinfo)<0)
  185.        {
  186.    pdir->status = 2;
  187.    return NULL;
  188.        }
  189.        else
  190.    return pdir->fileinfo.name;
  191.        break;
  192.    case 2: /* EOF */
  193.        return NULL;
  194.    }
  195. #else /* POSIX */
  196.    {
  197. struct dirent * dentry;
  198. if (pdir->dir==NULL) {
  199.     eventlog(eventlog_level_error,"p_readdir","POSIX: got pdir with NULL dir");
  200.     return NULL;
  201. }
  202. if ((dentry=readdir(pdir->dir))==NULL)
  203.     return NULL;
  204. return dentry->d_name;
  205.    }
  206. #endif /* WIN32-POSIX */
  207. }
  208. extern int p_closedir(t_pdir * pdir) {
  209.    int ret;
  210.    
  211.    if (pdir==NULL) {
  212.       eventlog(eventlog_level_error,"p_closedir","got NULL pdir");
  213.       return -1;
  214.    }
  215.    if (pdir->path==NULL) {
  216.       eventlog(eventlog_level_error,"p_closedir","got pdir with NULL path");
  217.       return -1;
  218.    }
  219.    
  220. #ifdef WIN32
  221.    if (pdir->status!=-1)
  222.    {
  223.        if (pdir->lFindHandle<0) {
  224.    eventlog(eventlog_level_info,"p_closedir","WIN32: got NULL findhandle");
  225.    return -1;
  226.        }
  227.        _findclose(pdir->lFindHandle); /* FIXME: what does _findclose() return on error? */
  228.    }
  229.    ret = 0;
  230. #else /* POSIX */
  231.    if (pdir->dir==NULL) {
  232.       eventlog(eventlog_level_info,"p_closedir","POSIX: got NULL dir");
  233.       return -1;
  234.    }
  235. # ifdef CLOSEDIR_VOID
  236.     closedir(pdir->dir);
  237.     ret = 0;
  238. # else
  239.     ret = closedir(pdir->dir);
  240. # endif
  241. #endif /* WIN32-POSIX */
  242.    
  243.    free((void *)pdir->path); /* avoid warning */
  244.    free(pdir);
  245.    return ret;
  246. }