Пример #1
0
t_bool fill_user_and_group(t_ll *files, int *colsizes)
{
    t_finfo *finfo;
    int max_user_len;
    int max_group_len;
    int l;

    max_user_len = 0;
    max_group_len = 0;
    ll_iter(files) {
        finfo = (t_finfo*)files->data;
        if (!g_opts->longlistgroup)
        {
            l = fill_user(finfo);
            if (l > max_user_len)
                max_user_len = l;
        }
        l = fill_group(finfo);
        if (l > max_group_len)
            max_group_len = l;
    }
    if (!g_opts->longlistgroup)
        colsizes[COL_USER]  = MIN(MAX_COL_SIZE, max_user_len);
    colsizes[COL_GROUP] = MIN(MAX_COL_SIZE, max_group_len);
    return (true);
}
Пример #2
0
static ErlDrvTermData *
make_group (pwd_drv_t *drv, struct group *grp, size_t *count)
{
  size_t gr_mem_len = group_mem_length (grp);

   *count = group_term_count ( gr_mem_len );
   ErlDrvTermData *result = (ErlDrvTermData *)driver_alloc (sizeof (ErlDrvTermData) * *count);
   if (!result)
     {
       fprintf (drv->log, "Couldn't allocate memory for result (size: %ld)\n", (long int)*count);
       fflush (drv->log);
        
       *count = 0;
       return 0;
     }

   fill_group (result, grp, 0, 0, 0);
   return result;
}
Пример #3
0
static int
get_grall (pwd_drv_t *drv)
{
  size_t grp_count = 0;
  size_t result_count = 0;
  struct group * grp = NULL;
  setgrent ();
  while ((grp = getgrent ()))
    {
      grp_count++;
      result_count += group_term_count( group_mem_length(grp) );
    }
  endgrent ();
  grp = NULL;

  ErlDrvTermData *result = (ErlDrvTermData *) driver_alloc (sizeof (ErlDrvTermData) * (result_count + 3));
  if (!result)
    {
      fprintf (drv->log, "Couldn't allocate memory for result\n");
      fflush (drv->log);

      return send_error (drv, "error", "Couldn't allocate memory for result");
    }

  char **names = (char **) driver_alloc (sizeof (char *) * grp_count);
  char **pwds  = (char **) driver_alloc (sizeof (char *) * grp_count);
  char ***mems = (char ***) driver_alloc (sizeof (char**) * grp_count);

  setgrent();

  size_t result_idx = 0;
  ErlDrvTermData *result_it = result;
  grp = getgrent();
  while (grp)
    {
      result_it += fill_group (result_it, grp, &names[result_idx], &pwds[result_idx], &mems[result_idx]);
      result_idx++;

      grp = getgrent();
    }

  endgrent();

  *result_it++ = ERL_DRV_NIL;
  *result_it++ = ERL_DRV_LIST;
  *result_it++ = grp_count + 1;

  int r = send_wrapped (driver_mk_port(drv->port),
                        result,
                        result_count + 3);

  size_t i;
  for (i = 0; i < grp_count; ++i)
    {
      driver_free (pwds[i]);
      driver_free (names[i]);

      char ** mem_it = mems[i];
      while (*mem_it)
        {
          driver_free (*mem_it);
          mem_it++;
        }
    }

  driver_free (pwds);
  driver_free (names);
  driver_free (mems);

  driver_free (result);
  return r;
}