// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chaps/pam_helper_mock.h"

#include <base/notreached.h>
#include <security/pam_appl.h>
#include <security/pam_modules.h>

#include "chaps/chaps_utility.h"

// Create PAM stubs to keep the linker happy when building the tests.

int pam_get_user(pam_handle_t* pamh, const char** user, const char* prompt) {
  NOTREACHED();
  return 0;
}

int pam_get_item(const pam_handle_t* pamh, int item_type, const void** item) {
  NOTREACHED();
  return 0;
}

const char* pam_strerror(pam_handle_t* pamh, int errnum) {
  NOTREACHED();
  return NULL;
}

int pam_set_data(pam_handle_t* pamh,
                 const char* module_data_name,
                 void* data,
                 void (*cleanup)(pam_handle_t* pamh,
                                 void* data,
                                 int error_status)) {
  NOTREACHED();
  return 0;
}

int pam_get_data(const pam_handle_t* pamh,
                 const char* module_data_name,
                 const void** data) {
  NOTREACHED();
  return 0;
}

int pam_putenv(pam_handle_t* pamh, const char* name_value) {
  NOTREACHED();
  return 0;
}

const char* pam_getenv(pam_handle_t* pamh, const char* name) {
  NOTREACHED();
  return NULL;
}
