Esempio n. 1
0
static int getpwent_to_file(FILE *output) {
  struct passwd result;
  char *buffer;
  size_t buflen = 1024;
  int errnop;
  enum nss_status ret;

  _nss_cache_setpwent_path(PASSWD_FILE);

  buffer = malloc(buflen);

  do {
    ret = _nss_cache_getpwent_r(&result, buffer, buflen, &errnop);
    if (ret == NSS_STATUS_SUCCESS) {
      fprintf(output, "%s:%s:%d:%d:%s:%s:%s\n", result.pw_name,
              result.pw_passwd, result.pw_uid, result.pw_gid, result.pw_gecos,
              result.pw_dir, result.pw_shell);
    }
    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 1;
    }
  } while (ret == NSS_STATUS_SUCCESS || ret == NSS_STATUS_TRYAGAIN);

  free(buffer);

  return 0;
}
Esempio n. 2
0
static int getpwuid_wrapper(uid_t uid) {

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

  _nss_cache_setpwent_path(PASSWD_FILE);

  buffer = malloc(buflen);

  do {
    ret = _nss_cache_getpwuid_r(uid, &result, buffer, buflen, &errnop);
    if (ret == NSS_STATUS_SUCCESS) {
      // printf("found %s, %d\n", result.pw_name, result.pw_uid);
      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;
}
Esempio n. 3
0
static int getspent_to_file(FILE *output) {
  struct spwd result;
  char *buffer;
  size_t buflen = 1024;
  int errnop;
  enum nss_status ret;

  _nss_cache_setpwent_path(SHADOW_FILE);

  buffer = malloc(buflen);

  do {
    ret = _nss_cache_getspent_r(&result, buffer, buflen, &errnop);
    if (ret == NSS_STATUS_SUCCESS) {
      fprintf(output, "%s:%s:", result.sp_namp, result.sp_pwdp);
      // sigh, empty numberical fields are -1 in the struct,
      // so if necessary convert back to empty fields
      if (result.sp_lstchg != -1) {
        fprintf(output, "%ld:", result.sp_lstchg);
      } else {
        fprintf(output, ":");
      }
      if (result.sp_min != -1) {
        fprintf(output, "%ld:", result.sp_min);
      } else {
        fprintf(output, ":");
      }
      if (result.sp_max != -1) {
        fprintf(output, "%ld:", result.sp_max);
      } else {
        fprintf(output, ":");
      }
      if (result.sp_warn != -1) {
        fprintf(output, "%ld:", result.sp_warn);
      } else {
        fprintf(output, ":");
      }
      if (result.sp_inact != -1) {
        fprintf(output, "%ld:", result.sp_inact);
      } else {
        fprintf(output, ":");
      }
      if (result.sp_expire != -1) {
        fprintf(output, "%ld:", result.sp_expire);
      } else {
        fprintf(output, ":");
      }
      if (result.sp_flag != -1) {
        fprintf(output, "%ld", result.sp_flag);
      }
      fprintf(output, "\n");
    }
    if (ret == NSS_STATUS_TRYAGAIN) {
      buflen = buflen * 2;
      buffer = realloc(buffer, buflen);
    }
    if (ret == NSS_STATUS_UNAVAIL) {
      perror("ERROR: failed to access shadow test data");
      return 1;
    }
  } while (ret == NSS_STATUS_SUCCESS || ret == NSS_STATUS_TRYAGAIN);

  free(buffer);

  return 0;
}