void errorstring_x11display(const x11display_t * x11disp, int x11_errcode, char * buffer, uint8_t buffer_size) { int err ; int x11_err ; if (!buffer_size) { err = EINVAL ; PRINTUINT8_ERRLOG(buffer_size) ; goto ONERR; } x11_err = XGetErrorText(x11disp->sys_display, x11_errcode, buffer, buffer_size) ; if (x11_err) { err = EINVAL ; TRACESYSCALL_ERRLOG("XGetErrorText", err) ; PRINTINT_ERRLOG(x11_err) ; goto ONERR; } buffer[buffer_size-1] = 0 ; return ; ONERR: if (buffer_size) { snprintf(buffer, buffer_size, "%d", x11_errcode) ; buffer[buffer_size-1] = 0 ; } TRACEEXIT_ERRLOG(err); return ; }
int free_x11display(x11display_t * x11disp) { int err; if (x11disp->idmap) { memblock_t mblock = memblock_INIT(sizeof(x11windowmap_t), (uint8_t*)x11disp->idmap); err = FREE_MM(&mblock); if ( x11disp->sys_display && XCloseDisplay(x11disp->sys_display)) { err = ECOMM; TRACESYSCALL_ERRLOG("XCloseDisplay", err); } x11disp->idmap = 0; x11disp->sys_display = 0; if (err) goto ONERR; } return 0 ; ONERR: TRACEEXITFREE_ERRLOG(err); return err; }
int switchpermanent_syslogin(syslogin_t* syslogin, sys_userid_t uid) { int err; VALIDATE_INPARAM_TEST(uid != sys_userid_FREE, ONERR, ); err = switchuser(syslogin, uid); if (err) goto ONERR; err = setreuid(uid, uid); if (err) { err = errno; TRACESYSCALL_ERRLOG("setreuid(uid,uid)", err); PRINTUINT32_ERRLOG(uid); goto ONERR; } // syslogin->currentuser // set in switchuser syslogin->realuser = uid; syslogin->privilegeduser = uid; return 0; ONERR: TRACEEXIT_ERRLOG(err); return err; }
static int switchuser(syslogin_t* syslogin, uid_t uid) { int err; err = seteuid(uid); if (err) { err = errno; TRACESYSCALL_ERRLOG("seteuid(uid)", err); PRINTUINT32_ERRLOG(uid); } syslogin->currentuser = uid; return err; }
int init_systimer(/*out*/systimer_t* timer, sysclock_e clock_type) { int err ; clockid_t clockid = convertclockid(clock_type) ; int fd ; fd = timerfd_create(clockid, TFD_NONBLOCK|TFD_CLOEXEC) ; if (-1 == fd) { err = errno ; TRACESYSCALL_ERRLOG("timerfd_create", err) ; PRINTINT_ERRLOG(clock_type) ; goto ONERR; } else { *timer = fd ; } return 0 ; ONERR: TRACEEXIT_ERRLOG(err); return err ; }
int new_syslogininfo(/*out*/syslogin_info_t** info, sys_userid_t uid) { int err; memblock_t mblock = memblock_FREE; slock_mutex(&s_syslogininfo_lock); errno = 0; struct passwd* pwd = getpwuid(uid); if (!pwd) { if (errno) { err = errno; TRACESYSCALL_ERRLOG("getpwuid(uid)", err); PRINTUINT32_ERRLOG(uid); } else { err = ENOENT; } goto UNLOCK; } size_t namesize = strlen(pwd->pw_name) + 1; // size username size_t nrofgrp = 0; #define GELEMSIZE (sizeof(sys_groupid_t) + sizeof(char*)) setgrent(); for (;;) { errno = 0; struct group* grp = getgrent(); if (!grp) { if (errno) { err = errno; TRACESYSCALL_ERRLOG("getgrent", err); goto UNLOCK; } break; } bool ismatch = (grp->gr_gid == pwd->pw_gid); for (int i = 0; !ismatch && grp->gr_mem[i]; ++i) { ismatch = (0 == strcmp(grp->gr_mem[i], pwd->pw_name)); } if (ismatch) { size_t len = strlen(grp->gr_name); if (nrofgrp == (SIZE_MAX/GELEMSIZE) || namesize >= SIZE_MAX/2 || len >= SIZE_MAX/2) { err = ENOMEM; goto UNLOCK; } nrofgrp ++; namesize += len + 1; } } size_t size = sizeof(syslogin_info_t) + namesize; size_t arrsize = nrofgrp * GELEMSIZE; if (size <= namesize) size = 0; size += arrsize; if (size <= arrsize) { err = ENOMEM; goto UNLOCK; } err = ALLOC_MM(size, &mblock); if (err) goto UNLOCK; syslogin_info_t* newobj = (syslogin_info_t*) mblock.addr; uint8_t* data = mblock.addr + sizeof(syslogin_info_t); size_t datasize = size - sizeof(syslogin_info_t); size_t dataoff; newobj->size = size; newobj->uid = uid; newobj->nrgroups = nrofgrp; newobj->gmain = 0; newobj->gname = (const char**) data; dataoff = nrofgrp * sizeof(char*); newobj->gid = (sys_groupid_t*) (data + dataoff); dataoff += nrofgrp * sizeof(sys_groupid_t); size_t fieldsize = strlen(pwd->pw_name) + 1; if (fieldsize > (datasize - dataoff)) { err = EAGAIN; goto UNLOCK; } memcpy(data + dataoff, pwd->pw_name, fieldsize); newobj->uname = (char*) (data + dataoff); dataoff += fieldsize; setgrent(); for (size_t gi = 0; gi < nrofgrp; ) { errno = 0; struct group* grp = getgrent(); if (!grp) { err = errno ? errno : ENOENT; TRACESYSCALL_ERRLOG("getgrent", err); goto UNLOCK; } bool ismatch = (grp->gr_gid == pwd->pw_gid); for (int i = 0; !ismatch && grp->gr_mem[i]; ++i) { ismatch = (0 == strcmp(grp->gr_mem[i], pwd->pw_name)); } if (ismatch) { fieldsize = strlen(grp->gr_name) + 1; if (fieldsize > (datasize - dataoff)) { err = EAGAIN; goto UNLOCK; } char* gname = (char*) (data + dataoff); dataoff += fieldsize; memcpy(gname, grp->gr_name, fieldsize); if (grp->gr_gid == pwd->pw_gid) { newobj->gmain = gi; } newobj->gid[gi] = grp->gr_gid; newobj->gname[gi] = gname; ++gi; } } *info = newobj; UNLOCK: endgrent(); endpwent(); sunlock_mutex(&s_syslogininfo_lock); if (err) goto ONERR; return 0; ONERR: FREE_MM(&mblock); if (ENOENT != err) { TRACEEXIT_ERRLOG(err); } return err; }