I had the need to access some C library functions that weren't available via standard Tcl or
TclX, so I wrote a simple wrapper using
Critcl.
These are wrappers for some of the set/get uid functions in Unix, but you could use the same approach for most functions -
stevel April 5 2004
Compile using
$ critcl -pkg uid.tcl
You'll end up with a lib/uid directory containing a package ready for dropping into a
Starkit lib directory, or anywhere on your auto_path.
package require critcl
package provide uid 1.0
if {![critcl::compiling]} {
puts stderr "This extension cannot be compiled without critcl enabled"
exit 1
}
critcl::ccode {
#include <sys/types.h>
#include <unistd.h>
#include <pwd.h>
}
critcl::cproc setusergroup {char* name} int {
struct passwd *pwd = getpwnam(name);
if (pwd == NULL) {
return 0;
}
initgroups(name,pwd->pw_gid);
setgid(pwd->pw_gid);
setuid(pwd->pw_uid);
return 1;
}
critcl::cproc setuid {char* name} int {
struct passwd *pwd = getpwnam(name);
if (pwd == NULL) {
return 0;
}
setuid(pwd->pw_uid);
return 1;
}
critcl::cproc seteuid {char* name} int {
struct passwd *pwd = getpwnam(name);
if (pwd == NULL) {
return 0;
}
seteuid(pwd->pw_uid);
return 1;
}
critcl::cproc getuid {} int {
return getuid();
}
critcl::cproc geteuid {} int {
return geteuid();
}
critcl::cproc setsid {} int {
return setsid();
}