00001
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
00022
00023
00024
00025 #if 0
00026 #define TIMEOUT_SECS 60
00027 #else
00028 #define TIMEOUT_SECS 5
00029 #endif
00030
00031 static int httpTimeoutSecs = TIMEOUT_SECS;
00032
00038 static inline void *
00039 _free( const void * p)
00040
00041 {
00042 if (p != NULL) free((void *)p);
00043 return NULL;
00044 }
00045
00046
00047
00048 int avmagicdir = 0x3607113;
00049
00050 int avClosedir( 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
00059 (void) pthread_mutex_destroy(&avdir->lock);
00060
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
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
00088 if (i < 0 || i >= ac || av[i] == NULL)
00089 return NULL;
00090
00091
00092 avdir->offset = i;
00093
00094
00095
00096 dp->d_ino = i + 1;
00097 dp->d_reclen = 0;
00098
00099 #if !defined(hpux) && !defined(sun)
00100 #if !defined(__APPLE__)
00101 dp->d_off = 0;
00102 #endif
00103
00104 dp->d_type = dt[i];
00105
00106 #endif
00107
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
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
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
00140
00141 avdir->fd = avmagicdir;
00142
00143 avdir->data = (char *) dp;
00144
00145 avdir->allocation = nb;
00146 avdir->size = ac;
00147 avdir->offset = -1;
00148 avdir->filepos = 0;
00149
00150 #if defined(HAVE_PTHREAD_H)
00151
00152 (void) pthread_mutex_init(&avdir->lock, NULL);
00153
00154 #endif
00155
00156 ac = 0;
00157
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
00161
00162 av[ac] = NULL;
00163
00164
00165 return (DIR *) avdir;
00166
00167 }
00168