?revision_form?Rev ?revision_input??revision_submit??revision_endform?
  
    Blame |
    Last modification |
    View Log
    | RSS feed
  
  
/*
**  Copyright 1998-2003 University of Illinois Board of Trustees
**  Copyright 1998-2003 Mark D. Roth
**  All rights reserved.
**
**  wrapper.c - libtar high-level wrapper code
**
**  Mark D. Roth <roth@uiuc.edu>
**  Campus Information Technologies and Educational Services
**  University of Illinois at Urbana-Champaign
*/
#include <internal.h>
#include <stdio.h>
#include <sys/param.h>
#include <dirent.h>
#include <errno.h>
#ifdef STDC_HEADERS
# include <string.h>
#endif
int
tar_extract_glob
(TAR 
*t
, char *globname
, char *prefix
)
{
        char *filename
;
        char buf
[MAXPATHLEN
];
        int i
;
        while ((i 
= th_read
(t
)) == 0)
        {
                filename 
= th_get_pathname
(t
);
                if (fnmatch
(globname
, filename
, FNM_PATHNAME 
| FNM_PERIOD
))
                {
                        if (TH_ISREG
(t
) && tar_skip_regfile
(t
))
                                return -1;
                        continue;
                }
                if (t
->options 
& TAR_VERBOSE
)
                        th_print_long_ls
(t
);
                if (prefix 
!= NULL
)
                        snprintf(buf
, sizeof(buf
), "%s/%s", prefix
, filename
);
                else
                        strlcpy
(buf
, filename
, sizeof(buf
));
                if (tar_extract_file
(t
, filename
) != 0)
                        return -1;
        }
        return (i 
== 1 ? 0 : -1);
}
int
tar_extract_all
(TAR 
*t
, char *prefix
)
{
        char *filename
;
        char buf
[MAXPATHLEN
];
        int i
;
#ifdef DEBUG
        printf("==> tar_extract_all(TAR *t, \"%s\")\n",
               (prefix 
? prefix 
: "(null)"));
#endif
        while ((i 
= th_read
(t
)) == 0)
        {
#ifdef DEBUG
                puts("    tar_extract_all(): calling th_get_pathname()");
#endif
                filename 
= th_get_pathname
(t
);
                if (t
->options 
& TAR_VERBOSE
)
                        th_print_long_ls
(t
);
                if (prefix 
!= NULL
)
                        snprintf(buf
, sizeof(buf
), "%s/%s", prefix
, filename
);
                else
                        strlcpy
(buf
, filename
, sizeof(buf
));
                free(filename
);
#ifdef DEBUG
                printf("    tar_extract_all(): calling tar_extract_file(t, "
                       "\"%s\")\n", buf
);
#endif
                if (tar_extract_file
(t
, buf
) != 0)
                        return -1;
        }
        return (i 
== 1 ? 0 : -1);
}
int
tar_append_tree
(TAR 
*t
, char *realdir
, char *savedir
)
{
        char realpath
[MAXPATHLEN
];
        char savepath
[MAXPATHLEN
];
        struct dirent 
*dent
;
        DIR 
*dp
;
        struct stat s
;
#ifdef DEBUG
        printf("==> tar_append_tree(0x%lx, \"%s\", \"%s\")\n",
               t
, realdir
, (savedir 
? savedir 
: "[NULL]"));
#endif
        if (tar_append_file
(t
, realdir
, savedir
) != 0)
                return -1;
#ifdef DEBUG
        puts("    tar_append_tree(): done with tar_append_file()...");
#endif
        dp 
= opendir
(realdir
);
        if (dp 
== NULL
)
        {
                if (errno 
== ENOTDIR
)
                        return 0;
                return -1;
        }
        while ((dent 
= readdir
(dp
)) != NULL
)
        {
                if (strcmp(dent
->d_name
, ".") == 0 ||
                    strcmp(dent
->d_name
, "..") == 0)
                        continue;
                snprintf(realpath
, MAXPATHLEN
, "%s/%s", realdir
,
                         dent
->d_name
);
                if (savedir
)
                        snprintf(savepath
, MAXPATHLEN
, "%s/%s", savedir
,
                                 dent
->d_name
);
                if (lstat
(realpath
, &s
) != 0)
                        return -1;
                if (S_ISDIR
(s.
st_mode))
                {
                        if (tar_append_tree
(t
, realpath
,
                                            (savedir 
? savepath 
: NULL
)) != 0)
                                return -1;
                        continue;
                }
                if (tar_append_file
(t
, realpath
,
                                    (savedir 
? savepath 
: NULL
)) != 0)
                        return -1;
        }
        closedir
(dp
);
        return 0;
}