func changeUser(username string) error { currentUser, err := user.Current() if err != nil { return util.Errorf("Could not determine current user: %s", err) } uid, gid, err := p2_user.IDs(username) if err != nil { return util.Errorf("Could not retrieve uid/gid for %q: %s", username, err) } if strconv.Itoa(uid) == currentUser.Uid && strconv.Itoa(gid) == currentUser.Gid { return nil } userCstring := C.CString(username) defer C.free(unsafe.Pointer(userCstring)) ret, err := C.initgroups(userCstring, C.__gid_t(gid)) if ret != 0 && err != nil { return util.Errorf("Could not initgroups for %q (primary gid %v): %s", username, gid, err) } ret, err = C.setgid(C.__gid_t(gid)) if ret != 0 && err != nil { return util.Errorf("Could not setgid %v: %s", gid, err) } ret, err = C.setuid(C.__uid_t(uid)) if ret != 0 && err != nil { return util.Errorf("Could not setuid %v: %s", uid, err) } return nil }
//Setgid set the gid to gid func Setgid(gid int) error { ret, err := C.setgid(C.__gid_t(gid)) if ret == C.int(0) { return nil } return err }
func changeUser(username string) error { uid, gid, err := user.IDs(username) if err != nil { return util.Errorf("Could not retrieve uid/gid for %q: %s", username, err) } userCstring := C.CString(username) defer C.free(unsafe.Pointer(userCstring)) ret, err := C.initgroups(userCstring, C.__gid_t(gid)) if ret != 0 && err != nil { return util.Errorf("Could not initgroups for %q (primary gid %v): %s", username, gid, err) } ret, err = C.setgid(C.__gid_t(gid)) if ret != 0 && err != nil { return util.Errorf("Could not setgid %v: %s", gid, err) } ret, err = C.setuid(C.__uid_t(uid)) if ret != 0 && err != nil { return util.Errorf("Could not setuid %v: %s", uid, err) } return nil }
func lookupUnix(gid int, groupname string, lookupByName bool) (*Group, error) { var grp C.struct_group var result *C.struct_group var bufSize C.long if runtime.GOOS == "freebsd" { panic("Don't know how to deal with freebsd.") } else { bufSize = C.sysconf(C._SC_GETGR_R_SIZE_MAX) * 20 if bufSize <= 0 || bufSize > 1<<20 { return nil, fmt.Errorf("group: unreasonable _SC_GETGR_R_SIZE_MAX of %d", bufSize) } } buf := C.malloc(C.size_t(bufSize)) defer C.free(buf) var rv C.int if lookupByName { nameC := C.CString(groupname) defer C.free(unsafe.Pointer(nameC)) rv = C.getgrnam_r(nameC, &grp, (*C.char)(buf), C.size_t(bufSize), &result) if rv != 0 { return nil, fmt.Errorf("group: lookup groupname %s: %s", groupname, syscall.Errno(rv)) } if result == nil { return nil, UnknownGroupError(groupname) } } else { rv = C.getgrgid_r(C.__gid_t(gid), &grp, (*C.char)(buf), C.size_t(bufSize), &result) if rv != 0 { return nil, fmt.Errorf("group: lookup groupid %d: %s", gid, syscall.Errno(rv)) } if result == nil { return nil, UnknownGroupIdError(gid) } } u := &Group{ Gid: strconv.Itoa(int(grp.gr_gid)), Groupname: C.GoString(grp.gr_name), } return u, nil }
// Set updates parameters of the shared memory segment. func (shm *SharedMem) Set(info *SHMInfo) error { shmds := &C.struct_shmid_ds{ shm_perm: C.struct_ipc_perm{ uid: C.__uid_t(info.Perms.OwnerUID), gid: C.__gid_t(info.Perms.OwnerGID), mode: C.ushort(info.Perms.Mode & 0x1FF), }, } rc, err := C.shmctl(C.int(shm.id), C.IPC_SET, shmds) if rc == -1 { return err } return nil }
// Set updates parameters of the semaphore set. func (ss *SemaphoreSet) Set(ssi *SemSetInfo) error { sds := &C.struct_semid_ds{ sem_perm: C.struct_ipc_perm{ uid: C.__uid_t(ssi.Perms.OwnerUID), gid: C.__gid_t(ssi.Perms.OwnerGID), mode: C.ushort(ssi.Perms.Mode & 0x1FF), }, } rc, err := C.semctl_buf(C.int(ss.id), C.IPC_SET, sds) if rc == -1 { return err } return nil }
// Set updates parameters of the queue. func (mq MessageQueue) Set(mqi *MQInfo) error { mqds := &C.struct_msqid_ds{ msg_perm: C.struct_ipc_perm{ uid: C.__uid_t(mqi.Perms.OwnerUID), gid: C.__gid_t(mqi.Perms.OwnerGID), mode: C.ushort(mqi.Perms.Mode & 0x1FF), }, msg_qbytes: C.msglen_t(mqi.MaxBytes), } rc, err := C.msgctl(C.int(mq), C.IPC_SET, mqds) if rc == -1 { return err } return nil }
func (a *InoAttr) toCStat(o *C.struct_stat, timeout *C.double) { o.st_ino = C.__ino_t(a.Ino) o.st_mode = C.__mode_t(a.Mode) o.st_nlink = C.__nlink_t(a.Nlink) o.st_size = C.__off_t(a.Size) if a.Uid != nil { o.st_uid = C.__uid_t(*a.Uid) } if a.Gid != nil { o.st_gid = C.__gid_t(*a.Gid) } toCTime(&o.st_ctim, a.Ctim) toCTime(&o.st_mtim, a.Mtim) toCTime(&o.st_atim, a.Atim) if timeout != nil { (*timeout) = C.double(a.Timeout) } }