52extern XrdSysError
Elog;
67 if ((zFD = XrdSysFD_Open(path, O_RDONLY)) < 0)
75 if (
fstat(zFD, &zFStat)) memset(&zFStat, 0,
sizeof(zFStat));
83 if ((zFile = zip_fdopen(zFD, ZIP_CHECKCONS, &zrc)) == 0)
84 {rc = zip2syserr(
"fdopen", zrc);
98 if (zSubFile)
Close();
103 {
if (zip_close(zFile))
104 {zipEmsg(
"close", zip_get_error(zFile));
112 if (zPath) free(zPath);
126 {
if ((zrc = zip_fclose(zSubFile))) zrc = zip2syserr(
"close member", zrc);
132 if (zMember) {free(zMember); zMember = 0;}
149 if (zFile == 0)
return -EBADF;
154 {
if ((rc = zip_fclose(zSubFile))) zip2syserr(
"close", rc,
true);
162 if (zMember) free(zMember);
163 zMember = strdup(member);
167 zSubFile = zip_fopen(zFile, zMember, 0);
168 if (zSubFile == 0)
return zip2syserr(
"open", zip_get_error(zFile));
192 if (zSubFile == 0)
return -EBADF;
197 if (offset != zOffset)
198 {
if (!zSeek)
return -ESPIPE;
199 if (zip_fseek(zSubFile, offset, SEEK_SET))
200 return zip2syserr(
"seek into", zip_file_get_error(zSubFile));
210 zip_int64_t ret = zip_fread(zSubFile, buff, blen);
212 return zip2syserr(
"read", zip_file_get_error(zSubFile));
217 if (ret < (zip_int64_t)blen) zEOF =
true;
231 if (zSubFile == 0)
return -EBADF;
235 memcpy(&buf, &zFStat,
sizeof(
struct stat));
239 zip_stat_init(&zStat);
243 if (zip_stat(zFile, zMember, 0, &zStat) < 0)
244 return zip2syserr(
"stat", zip_get_error(zFile));
248 if (zStat.valid & ZIP_STAT_INDEX) buf.st_ino = zStat.index;
249 if (zStat.valid & ZIP_STAT_SIZE) buf.st_size = zStat.size;
264 memcpy(&buf, &zFStat,
sizeof(
struct stat));
268 zip_stat_init(&zStat);
272 if (zip_stat(zFile, mName, 0, &zStat) < 0)
273 return zip2syserr(
"stat", zip_get_error(zFile));
277 if (zStat.valid & ZIP_STAT_INDEX) buf.st_ino = zStat.index;
278 if (zStat.valid & ZIP_STAT_SIZE) buf.st_size = zStat.size;
289void XrdOssArcZipFile::zipEmsg(
const char *what,
zip_error_t* zerr)
296 if (zMember) target += zMember;
302 snprintf(eText,
sizeof(eText),
"unable to %s", what);
306 Elog.Emsg(
"ZipFile", eText, target.c_str(), zip_error_strerror(zerr));
313int XrdOssArcZipFile::zip2syserr(
const char *what,
zip_error_t* zerr,
bool msg)
315 int retc = zip_error_code_zip(zerr);
316 if (retc != ZIP_ER_OK)
318 {
case ZIP_ER_CRC: retc = EILSEQ;
break;
319 case ZIP_ER_EXISTS: retc = EEXIST;
break;
320 case ZIP_ER_INCONS: retc = ENOEXEC;
break;
321 case ZIP_ER_INUSE: retc = EBUSY;
break;
322 case ZIP_ER_INVAL: retc = EINVAL;
break;
323 case ZIP_ER_MEMORY: retc = ENOMEM;
break;
324 case ZIP_ER_NOENT: retc = ENOENT;
break;
325 case ZIP_ER_NOZIP: retc = ENOTBLK;
break;
326 case ZIP_ER_OPNOTSUPP: retc = EOPNOTSUPP;
break;
327 case ZIP_ER_RDONLY: retc = EROFS;
break;
328 case ZIP_ER_READ: retc = EIO;
break;
329 case ZIP_ER_SEEK: retc = ESPIPE;
break;
330 case ZIP_ER_WRITE: retc = EIO;
break;
331 default: retc = EDOM;
break;
334 retc = zip_error_code_system(zerr);
335 if (retc == 0) retc = ENOMSG;
336 else if (retc < 0) retc = -retc;
338 if (msg) zipEmsg(what, zerr);
339 zip_error_fini(zerr);
343int XrdOssArcZipFile::zip2syserr(
const char *what,
int zrc,
bool msg)
346 zip_error_init_with_code(&zerr, zrc);
347 return zip2syserr(what, &zerr, msg);
int Stat(struct stat &buf)
XrdOssArcZipFile(const char *path, int &rc)
ssize_t Read(void *buff, off_t offset, size_t blen)
int Open(const char *member)
XrdSysError Elog(0, "OssArc_")