You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/04/30 09:02:15 UTC
svn commit: r770092 - in /commons/sandbox/runtime/trunk/src/main/native:
include/acr_users.h os/unix/group.c os/unix/user.c
Author: mturk
Date: Thu Apr 30 07:02:15 2009
New Revision: 770092
URL: http://svn.apache.org/viewvc?rev=770092&view=rev
Log:
Implement current user and group on posix
Modified:
commons/sandbox/runtime/trunk/src/main/native/include/acr_users.h
commons/sandbox/runtime/trunk/src/main/native/os/unix/group.c
commons/sandbox/runtime/trunk/src/main/native/os/unix/user.c
Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_users.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_users.h?rev=770092&r1=770091&r2=770092&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_users.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_users.h Thu Apr 30 07:02:15 2009
@@ -47,6 +47,14 @@
const acr_pchar_t *name);
/**
+ * Create new Group object.
+ * @param env JNI environment to use.
+ * @param gid Group id which object to create.
+ */
+ACR_DECLARE(jobject) ACR_GroupObjectCreateFromId(JNIEnv *_E,
+ acr_gid_t gid);
+
+/**
* Create new User object array.
* @param env JNI environment to use.
* @param size User object array size.
@@ -61,6 +69,14 @@
ACR_DECLARE(jobject) ACR_UserObjectCreate(JNIEnv *_E,
const acr_pchar_t *name);
+/**
+ * Create new User object.
+ * @param env JNI environment to use.
+ * @param uid User id which object to create.
+ */
+ACR_DECLARE(jobject) ACR_UserObjectCreateFromId(JNIEnv *_E,
+ acr_uid_t uid);
+
#ifdef __cplusplus
}
#endif
Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/group.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/group.c?rev=770092&r1=770091&r2=770092&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/group.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/group.c Thu Apr 30 07:02:15 2009
@@ -136,6 +136,50 @@
return grp;
}
+ACR_DECLARE(jobject) ACR_GroupObjectCreateFromId(JNIEnv *_E, gid_t id)
+{
+ jobject gid;
+ jobject grp;
+ char *sid;
+ int rc;
+ struct group grb;
+ struct group *gr;
+ char buffer[4096];
+
+ rc = getgrgid_r(id, &grb, buffer, sizeof(buffer), &gr);
+ if (rc) {
+ if (ACR_STATUS_IS_ENOENT(ACR_FROM_OS_ERROR(rc)))
+ return NULL;
+ else if (ACR_STATUS_IS_EACCES(ACR_FROM_OS_ERROR(rc)))
+ ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0);
+ else
+ ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO,
+ ACR_FROM_OS_ERROR(rc));
+ }
+ if (!gr)
+ return NULL;
+
+ gid = ACR_DescriptorCreate(_E, 0, gr->gr_gid, NULL, NULL);
+ if (!gid) {
+
+ return NULL;
+ }
+ grp = (*_E)->NewObject(_E, _clazzn.i, J4MID(0000), gid);
+ if (!grp) {
+
+ return NULL;
+ }
+
+ SET_IFIELD_S(0000, grp, gr->gr_name);
+ /* Comment is unknown */
+ sid = ACR_Ltoa((acr_long_t)gr->gr_gid);
+ SET_IFIELD_S(0002, grp, sid);
+ SET_IFIELD_Z(0003, grp, JNI_TRUE);
+ ACR_Free(_E, THROW_FMARK, sid);
+
+ return grp;
+}
+
ACR_JNI_EXPORT_DECLARE(jobject, Group, get0)(ACR_JNISTDARGS,
jstring name)
{
@@ -150,6 +194,16 @@
return grp;
}
+ACR_JNI_EXPORT_DECLARE(jobject, Group, get1)(ACR_JNISTDARGS)
+{
+ jobject grp = NULL;
+ UNREFERENCED_O;
+
+ grp = ACR_GroupObjectCreateFromId(_E, getegid());
+
+ return grp;
+}
+
ACR_JNI_EXPORT_DECLARE(jboolean, Group, equals0)(ACR_JNISTDARGS,
jobject a, jobject b)
{
Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/user.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/user.c?rev=770092&r1=770091&r2=770092&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/user.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/user.c Thu Apr 30 07:02:15 2009
@@ -157,6 +157,56 @@
return usr;
}
+ACR_DECLARE(jobject) ACR_UserObjectCreateFromId(JNIEnv *_E, uid_t id)
+{
+ jobject uid;
+ jobject usr;
+ char *sid;
+ int rc;
+ struct passwd pwb;
+ struct passwd *pw;
+ char buffer[4096];
+
+ rc = getpwuid_r(id, &pwb, buffer, sizeof(buffer), &pw);
+ if (rc) {
+ if (ACR_STATUS_IS_ENOENT(ACR_FROM_OS_ERROR(rc)))
+ return NULL;
+ else if (ACR_STATUS_IS_EACCES(ACR_FROM_OS_ERROR(rc)))
+ ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0);
+ else
+ ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO,
+ ACR_FROM_OS_ERROR(rc));
+ return NULL;
+ }
+ if (!pw)
+ return NULL;
+
+ uid = ACR_DescriptorCreate(_E, 0, pw->pw_uid, NULL, NULL);
+ if (!uid) {
+
+ return NULL;
+ }
+ usr = (*_E)->NewObject(_E, _clazzn.i, J4MID(0000), uid);
+ if (!usr) {
+
+ return NULL;
+ }
+
+ SET_IFIELD_S(0000, usr, pw->pw_name);
+ SET_IFIELD_S(0001, usr, pw->pw_gecos);
+#ifdef DARWIN
+ /* Use user class name for comment */
+ SET_IFIELD_N(0002, usr, pw->pw_class);
+#endif
+ SET_IFIELD_S(0003, usr, pw->pw_dir);
+ SET_IFIELD_S(0004, usr, pw->pw_shell);
+ sid = ACR_Ltoa((acr_long_t)pw->pw_uid);
+ SET_IFIELD_S(0005, usr, sid);
+ ACR_Free(_E, THROW_FMARK, sid);
+
+ return usr;
+}
+
ACR_JNI_EXPORT_DECLARE(jobject, User, get0)(ACR_JNISTDARGS,
jstring name)
{
@@ -171,6 +221,16 @@
return usr;
}
+ACR_JNI_EXPORT_DECLARE(jobject, User, get1)(ACR_JNISTDARGS)
+{
+ jobject usr = NULL;
+ UNREFERENCED_O;
+
+ usr = ACR_UserObjectCreateFromId(_E, geteuid());
+
+ return usr;
+}
+
ACR_JNI_EXPORT_DECLARE(jboolean, User, equals0)(ACR_JNISTDARGS,
jobject a, jobject b)
{