Ejemplo n.º 1
0
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 ;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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 ;
}
Ejemplo n.º 6
0
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;
}