// Copyright 2016 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include <pwd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

#include "starboard/log.h"
#include "starboard/shared/nouser/user_internal.h"
#include "starboard/string.h"

namespace starboard {
namespace shared {
namespace nouser {

bool GetHomeDirectory(SbUser user, char* out_path, int path_size) {
  if (user != SbUserGetCurrent()) {
    return false;
  }

  const char* home_directory = getenv("HOME");
  if (home_directory) {
    SbStringCopy(out_path, home_directory, path_size);
    return true;
  }

  SB_DLOG(WARNING) << "No HOME environment variable.";
  struct passwd passwd;
  const size_t kBufferSize = SB_FILE_MAX_PATH * 4;
  char* buffer = new char[kBufferSize];
  struct passwd* pw_result = NULL;
  int result =
      getpwuid_r(getuid(), &passwd, buffer, kBufferSize, &pw_result);
  if (result != 0) {
    SB_DLOG(ERROR) << "getpwuid_r failed for uid " << getuid() << ": result = "
                   << result;
    delete[] buffer;
    return false;
  }

  SbStringCopy(out_path, passwd.pw_dir, path_size);
  delete[] buffer;
  return true;
}

}  // namespace nouser
}  // namespace shared
}  // namespace starboard
