view release on metacpan or search on metacpan
lib/Archive/Ar/Libarchive.xs view on Meta::CPAN
int count;
__LA_INT64_T status;
STRLEN len;
SV *sv_buffer;
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(sv_2mortal(newSViv(PTR2IV((void*)archive))));
PUTBACK;
count = call_sv(ar->callback, G_ARRAY);
SPAGAIN;
sv_buffer = SvRV(POPs);
status = SvI64(POPs);
if(status == ARCHIVE_OK)
{
*buffer = (void*) SvPV(sv_buffer, len);
}
PUTBACK;
FREETMPS;
LEAVE;
if(status == ARCHIVE_OK)
return len == 1 ? 0 : len;
else
return status;
}
static __LA_INT64_T
lib/Archive/Ar/Libarchive.xs view on Meta::CPAN
struct ar *ar = (struct ar *)cd;
int count;
__LA_INT64_T status;
dSP;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(sv_2mortal(newSViv(PTR2IV((void*)archive))));
XPUSHs(sv_2mortal(newSVpvn(buffer, length)));
PUTBACK;
call_sv(ar->callback, G_SCALAR);
SPAGAIN;
status = SvI64(POPs);
PUTBACK;
FREETMPS;
LEAVE;
return status;
}
static int
ar_close_callback(struct archive *archive, void *client_data)
{
return ARCHIVE_OK;
lib/Archive/Ar/Libarchive.xs view on Meta::CPAN
self->callback = NULL;
self->error = NULL;
self->longmess = NULL;
self->opt_symbols = NULL;
self->opt_warn = 0;
self->opt_chmod = 1; /* ignored */
self->opt_same_perms = 1; /* different: pp version this is true for root only */
self->opt_chown = 1;
ar_reset(self);
RETVAL = self;
OUTPUT:
RETVAL
int
set_opt(self, name, value)
struct ar *self
const char *name
SV *value
CODE:
if(!strcmp(name, "warn"))
RETVAL = self->opt_warn = SvIV(value);
lib/Archive/Ar/Libarchive.xs view on Meta::CPAN
else if(!strcmp(name, "same_perms"))
RETVAL = self->opt_same_perms = SvIV(value);
else if(!strcmp(name, "chown"))
RETVAL = self->opt_chown = SvIV(value);
else if(!strcmp(name, "type"))
RETVAL = self->opt_type = SvIV(value);
else if(!strcmp(name, "symbols"))
self->opt_symbols = SvREFCNT_inc(value); /* TODO: make set_opt return void; maybe */
else
warn("unknown or unsupported option %s", name);
OUTPUT:
RETVAL
int
get_opt(self, name)
struct ar *self
const char *name
CODE:
if(!strcmp(name, "warn"))
RETVAL = self->opt_warn;
else if(!strcmp(name, "chmod"))
lib/Archive/Ar/Libarchive.xs view on Meta::CPAN
RETVAL = self->opt_chown;
else if(!strcmp(name, "type"))
{
if(self->opt_type == ARCHIVE_AR_UNDEF)
XSRETURN_EMPTY;
else
RETVAL = self->opt_type;
}
else
warn("unknown or unsupported option %s", name);
OUTPUT:
RETVAL
void
_set_error(self, message, longmess)
struct ar *self
SV *message
SV *longmess
CODE:
if(self->error != NULL)
SvREFCNT_dec(self->error);
lib/Archive/Ar/Libarchive.xs view on Meta::CPAN
SV *
error(self, ...)
struct ar *self
CODE:
if(self->error == NULL)
XSRETURN_EMPTY;
if(items >= 2 && SvTRUE(ST(1)))
RETVAL = SvREFCNT_inc(self->longmess);
else
RETVAL = SvREFCNT_inc(self->error);
OUTPUT:
RETVAL
int
_read_from_filename(self, filename)
struct ar *self
const char *filename
CODE:
struct archive *archive;
int r;
lib/Archive/Ar/Libarchive.xs view on Meta::CPAN
else
{
_error(self,archive_error_string(archive));
RETVAL = 0;
}
#if ARCHIVE_VERSION_NUMBER < 3000000
archive_read_finish(archive);
#else
archive_read_free(archive);
#endif
OUTPUT:
RETVAL
int
_read_from_callback(self, callback)
struct ar *self
SV *callback
CODE:
struct archive *archive;
int r;
lib/Archive/Ar/Libarchive.xs view on Meta::CPAN
_error(self,archive_error_string(archive));
RETVAL = 0;
}
#if ARCHIVE_VERSION_NUMBER < 3000000
archive_read_finish(archive);
#else
archive_read_free(archive);
#endif
SvREFCNT_dec(callback);
self->callback = NULL;
OUTPUT:
RETVAL
int
_write_to_filename(self, filename)
struct ar *self
const char *filename
CODE:
struct archive *archive;
int r;
lib/Archive/Ar/Libarchive.xs view on Meta::CPAN
if(r != ARCHIVE_OK)
_error(self,archive_error_string(archive));
r = archive_write_open_filename(archive, filename);
if(r != ARCHIVE_OK)
_error(self,archive_error_string(archive));
if(r == ARCHIVE_OK || r == ARCHIVE_WARN)
RETVAL = ar_write_archive(archive, self);
else
RETVAL = 0;
archive_write_free(archive);
OUTPUT:
RETVAL
int
_write_to_callback(self, callback)
struct ar *self
SV *callback
CODE:
struct archive *archive;
int r;
lib/Archive/Ar/Libarchive.xs view on Meta::CPAN
r = archive_write_open(archive, (void*)self, NULL, ar_write_callback, ar_close_callback);
if(r != ARCHIVE_OK)
_error(self,archive_error_string(archive));
if(r == ARCHIVE_OK || r == ARCHIVE_WARN)
RETVAL = ar_write_archive(archive, self);
else
RETVAL = 0;
archive_write_free(archive);
SvREFCNT_dec(callback);
self->callback = NULL;
OUTPUT:
RETVAL
int
_remove(self,pathname)
struct ar *self
const char *pathname
CODE:
struct ar_entry **entry;
entry = &(self->first);
lib/Archive/Ar/Libarchive.xs view on Meta::CPAN
RETVAL = 1;
break;
}
if((*entry)->next == NULL)
break;
entry = &((*entry)->next);
}
OUTPUT:
RETVAL
void
_add_data(self,filename,data,uid,gid,date,mode)
struct ar *self
const char *filename
SV *data
__LA_INT64_T uid
__LA_INT64_T gid
time_t date
lib/Archive/Ar/Libarchive.xs view on Meta::CPAN
list = newAV();
for(entry = self->first; entry != NULL; entry = entry->next)
{
pathname = archive_entry_pathname(entry->entry);
av_push(list, newSVpv(pathname, strlen(pathname)));
}
RETVAL = newRV_noinc((SV*)list);
OUTPUT:
RETVAL
void
DESTROY(self)
struct ar *self
CODE:
ar_reset(self);
Safefree(self);
SV *
lib/Archive/Ar/Libarchive.xs view on Meta::CPAN
hv_store(hv, "size", 4, newSViv(entry->data_size), 0);
hv_store(hv, "data", 4, newSVpv(entry->data, entry->data_size), 0);
#pragma clang diagnostic pop
RETVAL = newRV_noinc((SV*)hv);
}
else
{
XSRETURN_EMPTY;
}
OUTPUT:
RETVAL
SV *
get_data(self, filename)
struct ar *self
const char *filename
CODE:
struct ar_entry *entry;
entry = ar_find_by_name(self, filename);
if(entry == NULL)
XSRETURN_EMPTY;
RETVAL = newSVpv(entry->data, entry->data_size);
OUTPUT:
RETVAL
void
rename(self, old, new)
struct ar *self
const char *old
const char *new
CODE:
struct ar_entry *entry;
lib/Archive/Ar/Libarchive.xs view on Meta::CPAN
entry = entry->next;
}
archive_write_close(disk);
archive_write_free(disk);
if(ok)
RETVAL = 1;
else
XSRETURN_EMPTY;
OUTPUT:
RETVAL
int
extract_file(self,filename)
struct ar *self
const char *filename
CODE:
struct ar_entry *entry;
struct archive *disk;
int ok;
lib/Archive/Ar/Libarchive.xs view on Meta::CPAN
ok = ar_entry_extract(self, entry, disk);
archive_write_close(disk);
archive_write_free(disk);
if(ok)
RETVAL = 1;
else
XSRETURN_EMPTY;
OUTPUT:
RETVAL
int
type(self)
struct ar *self
CODE:
RETVAL = self->opt_type;
OUTPUT:
RETVAL
int
contains_file(self, filename)
struct ar *self
const char *filename
CODE:
if(ar_find_by_name(self, filename))
RETVAL = 1;
else
XSRETURN_EMPTY;
OUTPUT:
RETVAL
void
clear(self)
struct ar *self
CODE:
ar_reset(self);
lib/Archive/Ar/Libarchive.xs view on Meta::CPAN
entry = ar_find_by_name(self, filename);
if(entry != NULL)
{
archive_entry_set_mode(entry->entry, mode);
RETVAL = 1;
}
else
{
XSRETURN_EMPTY;
}
OUTPUT:
RETVAL
int
_chown(self, filename, uid, gid)
struct ar *self
const char *filename
int uid
SV *gid
CODE:
lib/Archive/Ar/Libarchive.xs view on Meta::CPAN
}
else
{
XSRETURN_EMPTY;
}
const char *
_libarchive_version()
CODE:
RETVAL = ARCHIVE_VERSION_STRING;
OUTPUT:
RETVAL
TYPEMAP
struct ar * T_AR_ARCHIVE
__LA_INT64_T T_INT64
int64_t T_INT64
uint64_t T_UINT64
INPUT
T_AR_ARCHIVE
if (sv_isobject($arg) && sv_derived_from($arg, \"Archive::Ar::Libarchive\"))
$var = INT2PTR($type, SvIV((SV *) SvRV($arg)));
else
Perl_croak(aTHX_ \"$var is not of type Archive::Ar::Libarchive\");
T_INT64
$var = SvI64($arg);
T_UINT64
$var = SvU64($arg);
OUTPUT
T_AR_ARCHIVE
sv_setref_pv($arg, \"Archive::Ar::Libarchive\", (void *) $var);
T_INT64
$arg = newSVi64($var);
T_UINT64
$arg = newSVu64($var);
xs/ppport.h view on Meta::CPAN
PUSH_MULTICALL_FLAGS|5.018000||Viu
PUSHn|5.006000|5.003007|
PUSHp|5.003007|5.003007|
PUSHs|5.003007|5.003007|
push_scope|5.003007|5.003007|u
PUSHSTACK|5.005000||Viu
PUSHSTACKi|5.005000||Viu
PUSHSTACK_INIT_HWM|5.027002||Viu
PUSHTARG|5.003007||Viu
PUSHu|5.004000|5.003007|p
PUTBACK|5.003007|5.003007|
putc|5.003007||Viu
put_charclass_bitmap_innards|5.021004||Viu
put_charclass_bitmap_innards_common|5.023008||Viu
put_charclass_bitmap_innards_invlist|5.023008||Viu
put_code_point|5.021004||Viu
putc_unlocked|5.003007||Viu
putenv|5.005000||Viu
put_range|5.019009||Viu
putw|5.003007||Viu
pv_display|5.006000|5.003007|p
xs/ppport.h view on Meta::CPAN
{
dSP;
SV* sv = newSVpv(p, 0);
PUSHMARK(sp);
eval_sv(sv, G_SCALAR);
SvREFCNT_dec(sv);
SPAGAIN;
sv = POPs;
PUTBACK;
D_PPP_CROAK_IF_ERROR(croak_on_error);
return sv;
}
#endif
#endif
#if ! defined(vload_module) && defined(start_subparse)