]> WPIA git - gigi.git/blobdiff - natives/org_cacert_gigi_natives_SetUID.c
Implemented native Uidset to open a priviliged port
[gigi.git] / natives / org_cacert_gigi_natives_SetUID.c
diff --git a/natives/org_cacert_gigi_natives_SetUID.c b/natives/org_cacert_gigi_natives_SetUID.c
new file mode 100644 (file)
index 0000000..7b2068c
--- /dev/null
@@ -0,0 +1,40 @@
+#include <jni.h>  
+#include <sys/types.h>
+#include <unistd.h> 
+  
+#ifndef _Included_org_cacert_natives_SetUID  
+#define _Included_org_cacert_natives_SetUID  
+#ifdef __cplusplus  
+extern "C" {  
+#endif  
+  
+jobject getStatus(JNIEnv *env, int successCode, const char * message) {  
+  
+   jstring message_str = (*env)->NewStringUTF(env, message);
+   jboolean success = successCode;  
+   jclass cls = (*env)->FindClass(env, "Lorg/cacert/gigi/natives/SetUID$Status;");  
+   jmethodID constructor = (*env)->GetMethodID(env, cls, "<init>", "(ZLjava/lang/String;)V");  
+   return (*env)->NewObject(env, cls, constructor, success, message_str);  
+}  
+  
+JNIEXPORT jobject JNICALL Java_org_cacert_gigi_natives_SetUID_setUid  
+  (JNIEnv *env, jobject obj, jint uid, jint gid) {  
+if(setgid((int)gid)) {  
+         char str[15];
+       sprintf(str, "%d", gid);
+         return (jobject)getStatus(env, 0, str);  
+      } 
+  
+      if(setuid((int)uid)) {
+       char str[15];
+       sprintf(str, "%d", uid);
+         return (jobject)getStatus(env, 0, str);  
+      }  
+  
+      return (jobject)getStatus(env, 1, "Successfully set uid/gid.");  
+}  
+  
+#ifdef __cplusplus  
+}  
+#endif  
+#endif