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]

Reply via email to