RPM Package Manager, CVS Repository
http://rpm5.org/cvs/
____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson
Root: /v/rpm/cvs Email: [EMAIL PROTECTED]
Module: rpm Date: 01-Mar-2008 23:11:14
Branch: HEAD Handle: 2008030122111300
Modified files:
rpm/rpmio rpmrpc.c
Log:
- jbj: ftpOpendir: Add a ftp context similar to davOpendir. Use
avOpendir.
Summary:
Revision Changes Path
2.70 +94 -77 rpm/rpmio/rpmrpc.c
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: rpm/rpmio/rpmrpc.c
============================================================================
$ cvs diff -u -r2.69 -r2.70 rpmrpc.c
--- rpm/rpmio/rpmrpc.c 1 Mar 2008 19:12:21 -0000 2.69
+++ rpm/rpmio/rpmrpc.c 1 Mar 2008 22:11:13 -0000 2.70
@@ -6,6 +6,7 @@
#include <rpmio_internal.h>
#include <rpmmacro.h>
+#include <argv.h>
#define _RPMDAV_INTERNAL
#include <rpmdav.h>
@@ -943,6 +944,64 @@
#define alloca_strdup(_s) strcpy(alloca(strlen(_s)+1), (_s))
+/* =============================================================== */
+struct ftp_context_s {
+ const char *uri;
+/[EMAIL PROTECTED]@*/
+ urlinfo u;
+ int ac;
+ int nalloced;
+ ARGV_t av;
+/[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/
+ struct stat *st;
+ mode_t * modes;
+ size_t * sizes;
+ time_t * mtimes;
+};
+
+/[EMAIL PROTECTED]@*/
+static void *ftp_destroy_context(/[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/
struct ftp_context_s *ctx)
+ /[EMAIL PROTECTED] internalState @*/
+ /[EMAIL PROTECTED] ctx, internalState @*/
+{
+ if (ctx == NULL)
+ return NULL;
+ if (ctx->av != NULL)
+ ctx->av = argvFree(ctx->av);
+ ctx->modes = _free(ctx->modes);
+ ctx->sizes = _free(ctx->sizes);
+ ctx->mtimes = _free(ctx->mtimes);
+ ctx->u = urlFree(ctx->u, "ftp_destroy_context");
+ ctx->uri = _free(ctx->uri);
+ memset(ctx, 0, sizeof(*ctx));
+ ctx = _free(ctx);
+ return NULL;
+}
+
+/[EMAIL PROTECTED]@*/
+static void *ftp_create_context(const char *uri, /[EMAIL PROTECTED]@*/
struct stat *st)
+ /[EMAIL PROTECTED] internalState @*/
+ /[EMAIL PROTECTED] *st, internalState @*/
+{
+ struct ftp_context_s * ctx;
+ urlinfo u;
+
+/[EMAIL PROTECTED]@*/ /* FIX: h_errno annoyance. */
+ if (urlSplit(uri, &u))
+ return NULL;
+/[EMAIL PROTECTED]@*/
+
+ ctx = xcalloc(1, sizeof(*ctx));
+ ctx->uri = xstrdup(uri);
+ ctx->u = urlLink(u, "ftp_create_context");
+/[EMAIL PROTECTED]@*/ /* XXX note the assignment */
+ if ((ctx->st = st) != NULL)
+ memset(ctx->st, 0, sizeof(*ctx->st));
+/[EMAIL PROTECTED]@*/
+ return ctx;
+}
+/* =============================================================== */
+
static int ftpNLST(const char * url, ftpSysCall_t ftpSysCall,
/[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ struct stat * st,
/[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ char * rlbuf,
size_t rlbufsiz)
@@ -1214,32 +1273,31 @@
/[EMAIL PROTECTED] fileSystem, internalState @*/
{
AVDIR avdir;
- struct dirent * dp;
- size_t nb;
+ struct ftp_context_s * ctx;
+ struct stat * st = NULL;
const char * s, * sb, * se;
- const char ** av;
- unsigned char * dt;
- char * t;
- int ac;
+ int nac;
int c;
int rc;
if (_ftp_debug)
fprintf(stderr, "*** ftpOpendir(%s)\n", path);
+
+ /* Load FTP collection into argv. */
+ ctx = ftp_create_context(path, st);
+ if (ctx == NULL) {
+ errno = ENOENT; /* Note: ctx is NULL iff urlSplit() fails. */
+ return NULL;
+ }
+
rc = ftpNLST(path, DO_FTP_GLOB, NULL, NULL, 0);
if (rc)
return NULL;
- /*
- * ftpBuf now contains absolute paths, newline terminated.
- * Calculate the number of bytes to hold the directory info.
- */
- nb = sizeof(".") + sizeof("..");
- ac = 2;
+ nac = 0;
sb = NULL;
s = se = ftpBuf;
- while ((c = (int) *se) != (int) '\0') {
- se++;
+ while ((c = (int) *se++) != (int) '\0') {
switch (c) {
case '/':
sb = se;
@@ -1249,8 +1307,7 @@
for (sb = se; sb > s && sb[-1] != ' '; sb--)
{};
}
- ac++;
- nb += (se - sb);
+ nac++;
if (*se == '\n') se++;
sb = NULL;
@@ -1261,36 +1318,10 @@
}
}
- nb += sizeof(*avdir) + sizeof(*dp) + ((ac + 1) * sizeof(*av)) + (ac + 1);
- avdir = xcalloc(1, nb);
- /[EMAIL PROTECTED]@*/
- dp = (struct dirent *) (avdir + 1);
- av = (const char **) (dp + 1);
- dt = (unsigned char *) (av + (ac + 1));
- t = (char *) (dt + ac + 1);
- /[EMAIL PROTECTED]@*/
-
- avdir->fd = avmagicdir;
-/[EMAIL PROTECTED]@*/
- avdir->data = (char *) dp;
-/[EMAIL PROTECTED]@*/
- avdir->allocation = nb;
- avdir->size = ac;
- avdir->offset = -1;
- /* Hash the directory path for a d_ino analogue. */
- avdir->filepos = hashFunctionString(0, path, 0);
-
-#if defined(HAVE_PTHREAD_H)
-/[EMAIL PROTECTED] [EMAIL PROTECTED]/
- (void) pthread_mutex_init(&avdir->lock, NULL);
-/[EMAIL PROTECTED] [EMAIL PROTECTED]/
-#endif
-
- ac = 0;
- /[EMAIL PROTECTED] [EMAIL PROTECTED]/
- dt[ac] = (unsigned char)DT_DIR; av[ac++] = t; t = stpcpy(t, ".");
t++;
- dt[ac] = (unsigned char)DT_DIR; av[ac++] = t; t = stpcpy(t, "..");
t++;
- /[EMAIL PROTECTED] [EMAIL PROTECTED]/
+ ctx->av = xcalloc(nac+1, sizeof(*ctx->av));
+ ctx->modes = xcalloc(nac, sizeof(*ctx->modes));
+
+ nac = 0;
sb = NULL;
s = se = ftpBuf;
while ((c = (int) *se) != (int) '\0') {
@@ -1300,44 +1331,27 @@
sb = se;
/[EMAIL PROTECTED]@*/ break;
case '\r':
- /[EMAIL PROTECTED]@*/
- av[ac] = t;
- /[EMAIL PROTECTED]@*/
if (sb == NULL) {
+ ctx->modes[nac] = (*s == 'd' ? 0755 : 0644);
/[EMAIL PROTECTED]@*/
switch(*s) {
- case 'p':
- dt[ac] = (unsigned char) DT_FIFO;
- /[EMAIL PROTECTED]@*/ break;
- case 'c':
- dt[ac] = (unsigned char) DT_CHR;
- /[EMAIL PROTECTED]@*/ break;
- case 'd':
- dt[ac] = (unsigned char) DT_DIR;
- /[EMAIL PROTECTED]@*/ break;
- case 'b':
- dt[ac] = (unsigned char) DT_BLK;
- /[EMAIL PROTECTED]@*/ break;
- case '-':
- dt[ac] = (unsigned char) DT_REG;
- /[EMAIL PROTECTED]@*/ break;
- case 'l':
- dt[ac] = (unsigned char) DT_LNK;
- /[EMAIL PROTECTED]@*/ break;
- case 's':
- dt[ac] = (unsigned char) DT_SOCK;
- /[EMAIL PROTECTED]@*/ break;
- default:
- dt[ac] = (unsigned char) DT_UNKNOWN;
- /[EMAIL PROTECTED]@*/ break;
+ case 'p': ctx->modes[nac] |= S_IFIFO; /[EMAIL PROTECTED]@*/
break;
+ case 'c': ctx->modes[nac] |= S_IFCHR; /[EMAIL PROTECTED]@*/
break;
+ case 'd': ctx->modes[nac] |= S_IFDIR; /[EMAIL PROTECTED]@*/
break;
+ case 'b': ctx->modes[nac] |= S_IFBLK; /[EMAIL PROTECTED]@*/
break;
+ case '-': ctx->modes[nac] |= S_IFREG; /[EMAIL PROTECTED]@*/
break;
+ case 'l': ctx->modes[nac] |= S_IFLNK; /[EMAIL PROTECTED]@*/
break;
+ case 's': ctx->modes[nac] |= S_IFSOCK; /[EMAIL PROTECTED]@*/
break;
+ default: ctx->modes[nac] |= S_IFREG; /[EMAIL PROTECTED]@*/
break;
}
/[EMAIL PROTECTED]@*/
for (sb = se; sb > s && sb[-1] != ' '; sb--)
{};
}
- ac++;
- t = stpncpy(t, sb, (se - sb));
- t[-1] = '\0';
+ /[EMAIL PROTECTED]@*/
+ ctx->av[nac] = strndup(sb, (se-sb-1));
+ /[EMAIL PROTECTED]@*/
+ nac++;
if (*se == '\n') se++;
sb = NULL;
s = se;
@@ -1346,7 +1360,10 @@
/[EMAIL PROTECTED]@*/ break;
}
}
- av[ac] = NULL;
+
+ avdir = avOpendir(path, ctx->av, ctx->modes);
+
+ ctx = ftp_destroy_context(ctx);
/[EMAIL PROTECTED]@*/
return (DIR *) avdir;
@@ .
______________________________________________________________________
RPM Package Manager http://rpm5.org
CVS Sources Repository [email protected]