Archive-Unzip-Burst
view release on metacpan or search on metacpan
unzip-6.0/amiga/amiga.c view on Meta::CPAN
---------------------------------------------------------------------------*/
if (FUNCTION == APPEND_NAME) {
Trace((stderr, "appending filename [%s]\n", FnFilter1(pathcomp)));
while ((*G.build_end = *pathcomp++) != '\0') {
++G.build_end;
if ((G.build_end-G.buildpath) >= FILNAMSIZ) {
*--G.build_end = '\0';
Info(slide, 0x201, ((char *)slide,
"checkdir warning: path too long; truncating\n\
%s\n -> %s\n",
FnFilter1(G.filename), FnFilter2(G.buildpath)));
return MPN_INF_TRUNC; /* filename truncated */
}
}
Trace((stderr, "buildpath now = [%s]\n", FnFilter1(G.buildpath)));
/* could check for existence here, prompt for new name... */
return MPN_OK;
}
/*---------------------------------------------------------------------------
INIT: allocate and initialize buffer space for the file currently being
extracted. If file was renamed with an absolute path, don't prepend the
extract-to path.
---------------------------------------------------------------------------*/
if (FUNCTION == INIT) {
Trace((stderr, "initializing buildpath to "));
if ((G.buildpath = (char *)malloc(strlen(G.filename)+G.rootlen+1))
== (char *)NULL)
return MPN_NOMEM;
if ((G.rootlen > 0) && !G.renamed_fullpath) {
strcpy(G.buildpath, G.rootpath);
G.build_end = G.buildpath + G.rootlen;
} else {
*G.buildpath = '\0';
G.build_end = G.buildpath;
}
Trace((stderr, "[%s]\n", FnFilter1(G.buildpath)));
return MPN_OK;
}
/*---------------------------------------------------------------------------
ROOT: if appropriate, store the path in G.rootpath and create it if
necessary; else assume it's a zipfile member and return. This path
segment gets used in extracting all members from every zipfile specified
on the command line.
---------------------------------------------------------------------------*/
#if (!defined(SFX) || defined(SFX_EXDIR))
if (FUNCTION == ROOT) {
Trace((stderr, "initializing root path to [%s]\n",
FnFilter1(pathcomp)));
if (pathcomp == (char *)NULL) {
G.rootlen = 0;
return MPN_OK;
}
if (G.rootlen > 0) /* rootpath was already set, nothing to do */
return MPN_OK;
if ((G.rootlen = strlen(pathcomp)) > 0) {
if (stat(pathcomp, &G.statbuf) || !S_ISDIR(G.statbuf.st_mode)) {
/* path does not exist */
if (!G.create_dirs) {
G.rootlen = 0;
/* skip (or treat as stored file) */
return MPN_INF_SKIP;
}
/* create the directory (could add loop here scanning pathcomp
* to create more than one level, but why really necessary?) */
if (MKDIR(pathcomp, 0777) == -1) {
Info(slide, 1, ((char *)slide,
"checkdir: cannot create extraction directory: %s\n",
FnFilter1(pathcomp)));
G.rootlen = 0;
/* path didn't exist, tried to create, and failed: */
/* file exists, or 2+ subdir levels required */
return MPN_ERR_SKIP;
}
}
if ((G.rootpath = (char *)malloc(G.rootlen+2)) == NULL) {
G.rootlen = 0;
return MPN_NOMEM;
}
strcpy(G.rootpath, pathcomp);
if (G.rootpath[G.rootlen-1] != ':' && G.rootpath[G.rootlen-1] != '/')
G.rootpath[G.rootlen++] = '/';
G.rootpath[G.rootlen] = '\0';
Trace((stderr, "rootpath now = [%s]\n", FnFilter1(G.rootpath)));
}
return MPN_OK;
}
#endif /* !SFX || SFX_EXDIR */
/*---------------------------------------------------------------------------
END: free G.rootpath, immediately prior to program exit.
---------------------------------------------------------------------------*/
if (FUNCTION == END) {
Trace((stderr, "freeing rootpath\n"));
if (G.rootlen > 0) {
free(G.rootpath);
G.rootlen = 0;
}
return MPN_OK;
}
return MPN_INVALID; /* should never reach */
} /* end function checkdir() */
/**************************************/
/* Function close_outfile() */
/**************************************/
/* this part differs slightly with Zip */
/*-------------------------------------*/
void close_outfile(__G)
( run in 1.175 second using v1.01-cache-2.11-cpan-364913b4093 )