SPVM-Sys
view release on metacpan or search on metacpan
lib/SPVM/Sys/User.c view on Meta::CPAN
int32_t size = stack[0].ival;
if (!(size >= 0)) {
return env->die(env, stack, "The size $size must be greater than or equal to 0.", __func__, FILE_NAME, __LINE__);
}
void* obj_list = stack[1].oval;
if (obj_list) {
int32_t list_length = env->length(env, stack, obj_list);
if (!(size == list_length)) {
return env->die(env, stack, "If the list $list is defined, the size $size must the length of $list.", __func__, FILE_NAME, __LINE__);
}
}
int32_t* list = env->get_elems_int(env, stack, obj_list);
assert(sizeof(gid_t) == sizeof(int32_t));
int32_t list_length = getgroups(size, (gid_t*)list);
if (list_length == -1) {
env->die(env, stack, "[System Error]getgroups() failed:%s.", env->strerror_nolen(env, stack, errno), __func__, FILE_NAME, __LINE__);
return SPVM_NATIVE_C_BASIC_TYPE_ID_ERROR_SYSTEM_CLASS;
}
stack[0].ival = list_length;
return 0;
#endif
}
int32_t SPVM__Sys__User__setgroups(SPVM_ENV* env, SPVM_VALUE* stack) {
#if defined(_WIN32)
env->die(env, stack, "Sys::User#setgroups method is not supported in this system(defined(_WIN32)).", __func__, FILE_NAME, __LINE__);
return SPVM_NATIVE_C_BASIC_TYPE_ID_ERROR_NOT_SUPPORTED_CLASS;
#else
assert(sizeof(gid_t) == sizeof(int32_t));
void* obj_groups = stack[0].oval;
if (!obj_groups) {
return env->die(env, stack, "The groups $groups must be defined.", __func__, FILE_NAME, __LINE__);
}
int32_t* groups = env->get_elems_int(env, stack, obj_groups);
int32_t groups_length = env->length(env, stack, obj_groups);
assert(sizeof(gid_t) == sizeof(int32_t));
int32_t status = setgroups(groups_length, (gid_t*)groups);
if (status == -1) {
env->die(env, stack, "[System Error]setgroups() failed:%s.", env->strerror_nolen(env, stack, errno), __func__, FILE_NAME, __LINE__);
return SPVM_NATIVE_C_BASIC_TYPE_ID_ERROR_SYSTEM_CLASS;
}
stack[0].ival = status;
return 0;
#endif
}
int32_t SPVM__Sys__User__getpwuid(SPVM_ENV* env, SPVM_VALUE* stack) {
#if defined(_WIN32)
env->die(env, stack, "Sys::User#getpwuid method is not supported in this system(defined(_WIN32)).", __func__, FILE_NAME, __LINE__);
return SPVM_NATIVE_C_BASIC_TYPE_ID_ERROR_NOT_SUPPORTED_CLASS;
#else
int32_t error_id = 0;
int32_t uid = stack[0].ival;
errno = 0;
struct passwd* pwent = getpwuid(uid);
if (errno != 0) {
env->die(env, stack, "[System Error]getpwuid() failed:%s.", env->strerror_nolen(env, stack, errno), __func__, FILE_NAME, __LINE__);
return SPVM_NATIVE_C_BASIC_TYPE_ID_ERROR_SYSTEM_CLASS;
}
if (pwent == NULL) {
stack[0].oval = NULL;
}
else {
void* obj_sys_ent_passwd = env->new_pointer_object_by_name(env, stack, "Sys::User::Passwd", pwent, &error_id, __func__, FILE_NAME, __LINE__);
if (error_id) { return error_id; }
stack[0].oval = obj_sys_ent_passwd;
}
return 0;
#endif
}
int32_t SPVM__Sys__User__getpwnam(SPVM_ENV* env, SPVM_VALUE* stack) {
#if defined(_WIN32)
env->die(env, stack, "Sys::User#getpwnam method is not supported in this system(defined(_WIN32)).", __func__, FILE_NAME, __LINE__);
return SPVM_NATIVE_C_BASIC_TYPE_ID_ERROR_NOT_SUPPORTED_CLASS;
#else
int32_t error_id = 0;
void* obj_pwnam = stack[0].oval;
if (!obj_pwnam) {
return env->die(env, stack, "The user name $pwnam must be defined.", __func__, FILE_NAME, __LINE__);
}
const char* pwnam = env->get_chars(env, stack, obj_pwnam);
errno = 0;
struct passwd* pwent = getpwnam(pwnam);
if (errno != 0) {
env->die(env, stack, "[System Error]getpwnam() failed:%s.", env->strerror_nolen(env, stack, errno), __func__, FILE_NAME, __LINE__);
return SPVM_NATIVE_C_BASIC_TYPE_ID_ERROR_SYSTEM_CLASS;
}
if (pwent == NULL) {
stack[0].oval = NULL;
}
else {
void* obj_sys_ent_passwd = env->new_pointer_object_by_name(env, stack, "Sys::User::Passwd", pwent, &error_id, __func__, FILE_NAME, __LINE__);
if (error_id) { return error_id; }
stack[0].oval = obj_sys_ent_passwd;
}
return 0;
#endif
}
int32_t SPVM__Sys__User__getgrgid(SPVM_ENV* env, SPVM_VALUE* stack) {
#if defined(_WIN32)
env->die(env, stack, "Sys::User#getgrgid method is not supported in this system(defined(_WIN32)).", __func__, FILE_NAME, __LINE__);
return SPVM_NATIVE_C_BASIC_TYPE_ID_ERROR_NOT_SUPPORTED_CLASS;
#else
int32_t error_id = 0;
int32_t gid = stack[0].ival;
( run in 1.189 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )