rpmio/rpmdav.c

Go to the documentation of this file.
00001 /*@-modfilesys@*/
00006 #include "system.h"
00007 
00008 #if defined(HAVE_PTHREAD_H) && !defined(__LCLINT__)
00009 #include <pthread.h>
00010 #endif
00011 
00012 #include <rpmio_internal.h>
00013 
00014 #define _RPMDAV_INTERNAL
00015 #include <rpmdav.h>
00016                                                                                 
00017 #include "argv.h"
00018 #include "ugid.h"
00019 #include "debug.h"
00020 
00021 /*@access DIR @*/
00022 /*@access FD_t @*/
00023 /*@access urlinfo @*/
00024 
00025 #if 0   /* HACK: reasonable value needed. */
00026 #define TIMEOUT_SECS 60
00027 #else
00028 #define TIMEOUT_SECS 5
00029 #endif
00030 /*@unchecked@*/
00031 static int httpTimeoutSecs = TIMEOUT_SECS;
00032 
00038 /*@unused@*/ static inline /*@null@*/ void *
00039 _free(/*@only@*/ /*@null@*/ /*@out@*/ const void * p)
00040         /*@modifies p@*/
00041 {
00042     if (p != NULL)      free((void *)p);
00043     return NULL;
00044 }
00045 
00046 /* =============================================================== */
00047 /*@unchecked@*/
00048 int avmagicdir = 0x3607113;
00049 
00050 int avClosedir(/*@only@*/ DIR * dir)
00051 {
00052     AVDIR avdir = (AVDIR)dir;
00053 
00054 if (_av_debug)
00055 fprintf(stderr, "*** avClosedir(%p)\n", avdir);
00056 
00057 #if defined(HAVE_PTHREAD_H)
00058 /*@-moduncon -noeffectuncon @*/
00059     (void) pthread_mutex_destroy(&avdir->lock);
00060 /*@=moduncon =noeffectuncon @*/
00061 #endif
00062 
00063     avdir = _free(avdir);
00064     return 0;
00065 }
00066 
00067 struct dirent * avReaddir(DIR * dir)
00068 {
00069     AVDIR avdir = (AVDIR)dir;
00070     struct dirent * dp;
00071     const char ** av;
00072     unsigned char * dt;
00073     int ac;
00074     int i;
00075 
00076     if (avdir == NULL || !ISAVMAGIC(avdir) || avdir->data == NULL) {
00077         /* XXX TODO: EBADF errno. */
00078         return NULL;
00079     }
00080 
00081     dp = (struct dirent *) avdir->data;
00082     av = (const char **) (dp + 1);
00083     ac = avdir->size;
00084     dt = (char *) (av + (ac + 1));
00085     i = avdir->offset + 1;
00086 
00087 /*@-boundsread@*/
00088     if (i < 0 || i >= ac || av[i] == NULL)
00089         return NULL;
00090 /*@=boundsread@*/
00091 
00092     avdir->offset = i;
00093 
00094     /* XXX glob(3) uses REAL_DIR_ENTRY(dp) test on d_ino */
00095 /*@-type@*/
00096     dp->d_ino = i + 1;          /* W2DO? */
00097     dp->d_reclen = 0;           /* W2DO? */
00098 
00099 #if !defined(hpux) && !defined(sun)
00100 #if !defined(__APPLE__)
00101     dp->d_off = 0;              /* W2DO? */
00102 #endif
00103 /*@-boundsread@*/
00104     dp->d_type = dt[i];
00105 /*@=boundsread@*/
00106 #endif
00107 /*@=type@*/
00108 
00109     strncpy(dp->d_name, av[i], sizeof(dp->d_name));
00110 if (_av_debug)
00111 fprintf(stderr, "*** avReaddir(%p) %p \"%s\"\n", (void *)avdir, dp, dp->d_name);
00112     
00113     return dp;
00114 }
00115 
00116 /*@-boundswrite@*/
00117 DIR * avOpendir(const char * path)
00118 {
00119     AVDIR avdir;
00120     struct dirent * dp;
00121     size_t nb = 0;
00122     const char ** av;
00123     unsigned char * dt;
00124     char * t;
00125     int ac;
00126 
00127 if (_av_debug)
00128 fprintf(stderr, "*** avOpendir(%s)\n", path);
00129     nb = sizeof(".") + sizeof("..");
00130     ac = 2;
00131 
00132     nb += sizeof(*avdir) + sizeof(*dp) + ((ac + 1) * sizeof(*av)) + (ac + 1);
00133     avdir = xcalloc(1, nb);
00134 /*@-abstract@*/
00135     dp = (struct dirent *) (avdir + 1);
00136     av = (const char **) (dp + 1);
00137     dt = (char *) (av + (ac + 1));
00138     t = (char *) (dt + ac + 1);
00139 /*@=abstract@*/
00140 
00141     avdir->fd = avmagicdir;
00142 /*@-usereleased@*/
00143     avdir->data = (char *) dp;
00144 /*@=usereleased@*/
00145     avdir->allocation = nb;
00146     avdir->size = ac;
00147     avdir->offset = -1;
00148     avdir->filepos = 0;
00149 
00150 #if defined(HAVE_PTHREAD_H)
00151 /*@-moduncon -noeffectuncon -nullpass @*/
00152     (void) pthread_mutex_init(&avdir->lock, NULL);
00153 /*@=moduncon =noeffectuncon =nullpass @*/
00154 #endif
00155 
00156     ac = 0;
00157     /*@-dependenttrans -unrecog@*/
00158     dt[ac] = DT_DIR;    av[ac++] = t;   t = stpcpy(t, ".");     t++;
00159     dt[ac] = DT_DIR;    av[ac++] = t;   t = stpcpy(t, "..");    t++;
00160     /*@=dependenttrans =unrecog@*/
00161 
00162     av[ac] = NULL;
00163 
00164 /*@-kepttrans@*/
00165     return (DIR *) avdir;
00166 /*@=kepttrans@*/
00167 }
00168 /*@=boundswrite@*/

Generated on Tue Feb 19 23:28:20 2008 for rpm by  doxygen 1.5.1