blob: a61464dc0b580f410cb42ff714405edf17b6d270 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <axutil_dir_handler.h>
#include <platforms/axutil_platform_auto_sense.h>
#include <axutil_string.h>
#include <zlib.h>
#include <fcntl.h>
#include <axis2_unzip.h>
#include <axis2_crypt.h>
#include <axis2_ioapi.h>
#ifdef WIN32
#include <axis2_iowin32.h>
#endif
#define CASESENSITIVITY (0)
#define WRITEBUFFERSIZE (8192)
#define MAXFILENAME (256)
axis2_status_t aar_select();
int aar_extract(axis2_char_t *d_name);
extern int AXIS2_ALPHASORT();
int axis2_mkdir(dir_name)
const axis2_char_t* dir_name;
{
int value = 0;
#ifdef WIN32
value = mkdir(dir_name);
#else
value = mkdir(dir_name, 0775);
#endif
return value;
}
int axis2_create_dir(new_dir)
axis2_char_t *new_dir;
{
axis2_char_t *buffer ;
axis2_char_t *p;
int len = (int)strlen(new_dir);
if (len <= 0)
return 0;
buffer = (axis2_char_t*)malloc(len + 1);
strcpy(buffer, new_dir);
if (buffer[len-1] == '/')
{
buffer[len-1] = '\0';
}
if (axis2_mkdir(buffer) == 0)
{
free(buffer);
return 1;
}
p = buffer + 1;
while (1)
{
axis2_char_t hold;
while (*p && *p != '\\' && *p != '/')
p++;
hold = *p;
*p = 0;
if ((axis2_mkdir(buffer) == -1))
{
free(buffer);
return 0;
}
if (hold == 0)
break;
*p++ = hold;
}
free(buffer);
return 1;
}
int axis2_extract_currentfile(uf, popt_extract_without_path, popt_overwrite, password)
unzFile uf;
const int* popt_extract_without_path;
int* popt_overwrite;
const axis2_char_t* password;
{
axis2_char_t filename_inzip[256];
axis2_char_t* filename_withoutpath;
axis2_char_t* p;
int err = UNZ_OK;
FILE *fout = NULL;
void* buf;
uInt size_buf;
unz_file_info file_info;
err = unzGetCurrentFileInfo(uf, &file_info, filename_inzip, sizeof(filename_inzip), NULL, 0, NULL, 0);
if (err != UNZ_OK)
{
return err;
}
size_buf = WRITEBUFFERSIZE;
buf = (void*)malloc(size_buf);
if (buf == NULL)
return UNZ_INTERNALERROR;
p = filename_withoutpath = filename_inzip;
while ((*p) != '\0')
{
if (((*p) == '/') || ((*p) == '\\'))
filename_withoutpath = p + 1;
p++;
}
if ((*filename_withoutpath) == '\0')
{
if ((*popt_extract_without_path) == 0)
{
axis2_mkdir(filename_inzip);
}
}
else
{
const axis2_char_t* write_filename;
int skip = 0;
if ((*popt_extract_without_path) == 0)
write_filename = filename_inzip;
else
write_filename = filename_withoutpath;
err = unzOpenCurrentFilePassword(uf, password);
if ((skip == 0) && (err == UNZ_OK))
{
fout = fopen(write_filename, "wb");
if ((fout == NULL) && ((*popt_extract_without_path) == 0) &&
(filename_withoutpath != (axis2_char_t*)filename_inzip))
{
axis2_char_t c = *(filename_withoutpath - 1);
*(filename_withoutpath - 1) = '\0';
axis2_create_dir(write_filename);
*(filename_withoutpath - 1) = c;
fout = fopen(write_filename, "wb");
}
}
if (fout)
{
do
{
err = unzReadCurrentFile(uf, buf, size_buf);
if (err < 0)
{
break;
}
if (err > 0)
if (fwrite(buf, err, 1, fout) != 1)
{
err = UNZ_ERRNO;
break;
}
}
while (err > 0);
if (fout)
fclose(fout);
}
if (err == UNZ_OK)
{
err = unzCloseCurrentFile(uf);
}
else
unzCloseCurrentFile(uf);
}
free(buf);
return err;
}
int axis2_extract(uf, opt_extract_without_path, opt_overwrite, password)
unzFile uf;
int opt_extract_without_path;
int opt_overwrite;
const axis2_char_t* password;
{
uLong i;
unz_global_info gi;
int err;
err = unzGetGlobalInfo(uf, &gi);
if (err != UNZ_OK)
return -1;
for (i = 0;i < gi.number_entry;i++)
{
if (axis2_extract_currentfile(uf, &opt_extract_without_path,
&opt_overwrite,
password) != UNZ_OK)
break;
if ((i + 1) < gi.number_entry)
{
err = unzGoToNextFile(uf);
if (err != UNZ_OK)
{
return -1;
break;
}
}
}
return 0;
}
int aar_extract(axis2_char_t *d_name)
{
const axis2_char_t *zipfilename = NULL;
const axis2_char_t *filename_to_extract = NULL;
const axis2_char_t *password = NULL;
axis2_char_t filename_try[MAXFILENAME+16] = "";
int opt_do_extract_withoutpath = 0;
int opt_overwrite = 0;
int opt_extractdir = 0;
const axis2_char_t *dir_name = NULL;
unzFile uf = NULL;
if (zipfilename == NULL)
zipfilename = d_name;
filename_to_extract = d_name;
if (zipfilename)
{
zlib_filefunc_def ffunc;
strncpy(filename_try, zipfilename, MAXFILENAME - 1);
filename_try[ MAXFILENAME ] = '\0';
axis2_fill_win32_filefunc(&ffunc);
uf = AXIS2_UNZOPEN2(zipfilename, ffunc);
if (uf == NULL)
{
strcat(filename_try, ".zip");
uf = AXIS2_UNZOPEN2(zipfilename, ffunc);
}
}
if (uf == NULL)
return -1;
if (opt_extractdir && chdir(dir_name))
exit(-1);
return axis2_extract(uf, opt_do_extract_withoutpath, opt_overwrite, password);
unzCloseCurrentFile(uf);
return 0;
}
int axis2_extract_onefile(uf, filename, opt_extract_without_path, opt_overwrite, password)
unzFile uf;
const axis2_char_t* filename;
int opt_extract_without_path;
int opt_overwrite;
const axis2_char_t* password;
{
if (unzLocateFile(uf, filename, CASESENSITIVITY) != UNZ_OK)
return -1;
if (axis2_extract_currentfile(uf, &opt_extract_without_path,
&opt_overwrite,
password) == UNZ_OK)
return 0;
else
return -1;
}
AXIS2_EXTERN axis2_status_t AXIS2_CALL
axis2_archive_extract()
{
struct dirent **namelist;
int n, i;
axis2_char_t *ptr;
n = scandir(".", &namelist, 0, alphasort);
if (n < 0)
return AXIS2_FALSE;
else
{
while (n--)
{
if ((strcmp(namelist[n]->d_name, ".") == 0) ||
(strcmp(namelist[n]->d_name, "..") == 0))
{
for (i = n; i >= 0; i--) /* clean remaining memory before return */
free(namelist[i]);
free(namelist);
return (AXIS2_FALSE);
}
ptr = axutil_rindex(namelist[n]->d_name, '.');
if ((ptr) &&
(((strcmp(ptr, AXIS2_AAR_SUFFIX) == 0)) || (strcmp(ptr, AXIS2_MAR_SUFFIX) == 0)))
for (i = 0;i < n;i++)
if (strncmp(namelist[n]->d_name, namelist[i]->d_name, strlen(namelist[i]->d_name)) == 0)
{
int j;
for (j = n; j >= 0; j--) /* clean remaining memory before return */
free(namelist[j]);
free(namelist);
return (AXIS2_FALSE);
}
aar_extract(namelist[n]->d_name);
free(namelist[n]);
}
free(namelist);
}
return (AXIS2_TRUE);
}