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); }
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; }
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; }