AFS
view release on metacpan or search on metacpan
p = buffer;
if (strcmp(p, "read") == 0)
p = "rl";
else if (strcmp(p, "write") == 0)
p = "rlidwk";
else if (strcmp(p, "all") == 0)
p = "rlidwka";
else if (strcmp(p, "mail") == 0)
p = "lik";
else if (strcmp(p, "none") == 0)
p = "";
return parse_rights(p, rights);
}
static int32 parse_acl(p, ph, nh)
char *p;
HV *ph, *nh;
{
int32 pos, neg, acl;
char *facl;
char user[MAXSIZE];
if (sscanf(p, "%d", &pos) != 1)
return 0;
while (*p && *p != '\n')
p++;
if (*p == '\n')
p++;
if (sscanf(p, "%d", &neg) != 1)
return 0;
while (*p && *p != '\n')
p++;
if (*p == '\n')
p++;
while (pos--) {
if (sscanf(p, "%s %d", user, &acl) != 2)
return 0;
facl = format_rights(acl);
safe_hv_store(ph, user, strlen(user), newSVpv(facl, strlen(facl)), 0);
while (*p && *p != '\n')
p++;
if (*p == '\n')
p++;
}
while (neg--) {
if (sscanf(p, "%s %d", user, &acl) != 2)
return 0;
facl = format_rights(acl);
safe_hv_store(nh, user, strlen(user), newSVpv(facl, strlen(facl)), 0);
while (*p && *p != '\n')
p++;
if (*p == '\n')
p++;
}
return 1;
}
static int parse_volstat(stats, space)
HV *stats;
char *space;
{
struct VolumeStatus *status;
char *name, *offmsg, *motd;
char type[32];
status = (VolumeStatus *) space;
name = (char *) status + sizeof(*status);
offmsg = name + strlen(name) + 1;
motd = offmsg + strlen(offmsg) + 1;
safe_hv_store(stats, "Name", 4, newSVpv(name, strlen(name)), 0);
safe_hv_store(stats, "OffMsg", 6, newSVpv(offmsg, strlen(offmsg)), 0);
safe_hv_store(stats, "Motd", 4, newSVpv(motd, strlen(motd)), 0);
safe_hv_store(stats, "Vid", 3, newSViv(status->Vid), 0);
safe_hv_store(stats, "ParentId", 8, newSViv(status->ParentId), 0);
safe_hv_store(stats, "Online", 6, newSViv(status->Online), 0);
safe_hv_store(stats, "InService", 9, newSViv(status->InService), 0);
safe_hv_store(stats, "Blessed", 7, newSViv(status->Blessed), 0);
safe_hv_store(stats, "NeedsSalvage", 12, newSViv(status->NeedsSalvage), 0);
if (status->Type == ReadOnly)
strcpy(type, "ReadOnly");
else if (status->Type == ReadWrite)
strcpy(type, "ReadWrite");
else
sprintf(type, "%d", status->Type);
safe_hv_store(stats, "Type", 4, newSVpv(type, strlen(type)), 0);
safe_hv_store(stats, "MinQuota", 8, newSViv(status->MinQuota), 0);
safe_hv_store(stats, "MaxQuota", 8, newSViv(status->MaxQuota), 0);
safe_hv_store(stats, "BlocksInUse", 11, newSViv(status->BlocksInUse), 0);
safe_hv_store(stats, "PartBlocksAvail", 15, newSViv(status->PartBlocksAvail), 0);
safe_hv_store(stats, "PartMaxBlocks", 13, newSViv(status->PartMaxBlocks), 0);
return 1;
}
/* end of helper functions for FS class: */
/* helper functions for KAS class: */
static int parse_kaentryinfo(stats, ka)
HV *stats;
struct kaentryinfo *ka;
{
char buffer[sizeof(struct kaident)];
sprintf(buffer, "%s%s%s", ka->modification_user.name,
ka->modification_user.instance[0] ? "." : "", ka->modification_user.instance);
safe_hv_store(stats, "modification_user", 17, newSVpv(buffer, strlen(buffer)), 0);
safe_hv_store(stats, "minor_version", 13, newSViv(ka->minor_version), 0);
safe_hv_store(stats, "flags", 5, newSViv(ka->flags), 0);
safe_hv_store(stats, "user_expiration", 15, newSViv(ka->user_expiration), 0);
safe_hv_store(stats, "modification_time", 17, newSViv(ka->modification_time), 0);
safe_hv_store(stats, "change_password_time", 20, newSViv(ka->change_password_time), 0);
safe_hv_store(stats, "max_ticket_lifetime", 19, newSViv(ka->max_ticket_lifetime), 0);
safe_hv_store(stats, "key_version", 11, newSViv(ka->key_version), 0);
safe_hv_store(stats, "keyCheckSum", 11, newSVuv(ka->keyCheckSum), 0);
safe_hv_store(stats, "misc_auth_bytes", 15, newSVuv(ka->misc_auth_bytes), 0);
safe_hv_store(stats, "passwd_reuse", 12, newSViv(ka->reserved3), 0);
/* 1234567890123456789012345 */
return 1;
}
int32 op
SV * in
int32 setin
int32 setout
int32 follow
PPCODE:
{
struct ViceIoctl vi;
int32 code;
char space[MAXSIZE];
STRLEN insize;
if (!setpath)
path = NULL;
if (setout) {
space[0] = '\0';
vi.out_size = MAXSIZE;
vi.out = space;
}
else {
vi.out_size = 0;
vi.out = 0;
}
if (setin) {
vi.in = (char *) SvPV(ST(2), insize);
vi.in_size = insize;
}
else {
vi.in = 0;
vi.in_size = 0;
}
code = pioctl(path, op, &vi, follow);
SETCODE(code);
if (code == 0 && setout) {
EXTEND(sp, 1);
printf("out_size = %d\n", vi.out_size);
PUSHs(sv_2mortal(newSVpv(vi.out, vi.out_size)));
}
}
void
fs_getvolstats(dir,follow=1)
char * dir
int32 follow
PPCODE:
{
struct ViceIoctl vi;
int32 code;
char space[MAXSIZE];
HV *stats;
vi.out_size = MAXSIZE;
vi.in_size = 0;
vi.out = space;
code = pioctl(dir, VIOCGETVOLSTAT, &vi, follow);
SETCODE(code);
if (code == 0) {
stats = newHV();
if (parse_volstat(stats, space)) {
EXTEND(sp, 1);
PUSHs(sv_2mortal(newRV_noinc((SV *) stats)));
}
else {
hv_undef(stats);
}
}
}
void
fs_whereis(dir,ip=0,follow=1)
char * dir
int32 ip
int32 follow
PPCODE:
{
struct ViceIoctl vi;
int32 code;
char space[MAXSIZE];
vi.out_size = MAXSIZE;
vi.in_size = 0;
vi.out = space;
code = pioctl(dir, VIOCWHEREIS, &vi, follow);
SETCODE(code);
if (code == 0) {
struct in_addr *hosts = (struct in_addr *) space;
struct hostent *ht;
int i;
char *h;
for (i = 0; i < MAXHOSTS; i++) {
if (hosts[i].s_addr == 0)
break;
if (ip == 0) {
ht = gethostbyaddr((const char *) &hosts[i], sizeof(struct in_addr), AF_INET);
if (ht == NULL)
h = (char *) inet_ntoa(hosts[i]);
else
h = ht->h_name;
}
else {
h = (char *) inet_ntoa(hosts[i]);
}
XPUSHs(sv_2mortal(newSVpv(h, strlen(h))));
}
}
}
void
fs_checkservers(fast,cell=0,ip=0)
int32 fast
char * cell
int32 ip
PPCODE:
{
struct chservinfo checkserv;
struct ViceIoctl vi;
int32 code, *num;
char space[MAXSIZE];
( run in 0.540 second using v1.01-cache-2.11-cpan-d7a12ab2c7f )