Пример #1
0
static int getgrent_to_file(FILE *output) {

  struct group result;
  char *buffer;
  size_t buflen = 1024;
  int errnop;
  enum nss_status ret;
  int idx;
  
  _nss_cache_setgrent_path(GROUP_FILE);

  buffer = malloc(buflen);
  
  do {
    ret = _nss_cache_getgrent_r(&result, buffer, buflen, &errnop);
    if (ret == NSS_STATUS_SUCCESS) {
      fprintf(output, "%s:%s:%d:",
	      result.gr_name,
	      result.gr_passwd,
	      result.gr_gid
	      );
      // unroll **gr_mem
      for (idx = 0; result.gr_mem[idx] != NULL; idx++) {
	fprintf(output, "%s", result.gr_mem[idx]);
	if (result.gr_mem[idx+1] != NULL) {
	  fprintf(output, ",");
	}
      }
      fprintf(output, "\n");
    }
    if (ret == NSS_STATUS_TRYAGAIN) {
      buflen = buflen * 2;
      buffer = realloc(buffer, buflen);
    }
    if (ret == NSS_STATUS_UNAVAIL) {
      fprintf(stderr, "ERROR: failed to access group test data\n");
      return 1;
    }
  } while (ret == NSS_STATUS_SUCCESS || ret == NSS_STATUS_TRYAGAIN);

  free(buffer);

  return 0;
  
}
Пример #2
0
static int getgrgid_wrapper(gid_t gid) {

  struct group result;
  char *buffer = NULL;
  size_t buflen = 1024;
  int found = 255;
  int errnop;
  int ret;

  _nss_cache_setgrent_path(GROUP_FILE);

  buffer = malloc(buflen);

  do {
    ret = _nss_cache_getgrgid_r(gid, &result, buffer, buflen, &errnop);
    if (ret == NSS_STATUS_SUCCESS) {
      // printf("found %s, %d\n", result.gr_name, result.gr_gid);
      found = 0;
    }
    if (ret == NSS_STATUS_NOTFOUND) {
      found = 1;
    }
    if (ret == NSS_STATUS_TRYAGAIN) {
      buflen = buflen * 2;
      buffer = realloc(buffer, buflen);
    }
    if (ret == NSS_STATUS_UNAVAIL) {
      fprintf(stderr, "ERROR: failed to access passwd test data\n");
      return 2;
    }
  } while (ret == NSS_STATUS_TRYAGAIN);

  free(buffer);

  return found;
}