/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * 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.
 */

#pragma once

#include <sys/resource.h>
#include <sys/types.h>

#include <optional>
#include <string>
#include <vector>

#include <android-base/unique_fd.h>
#include <cutils/iosched_policy.h>

#include "mount_namespace.h"
#include "result.h"

namespace android {
namespace init {

class Descriptor {
  public:
    Descriptor(const std::string& name, android::base::unique_fd fd)
        : name_(name), fd_(std::move(fd)){};

    // Publish() unsets FD_CLOEXEC from the FD and publishes its name via setenv().  It should be
    // called when starting a service after fork() and before exec().
    void Publish() const;

  private:
    std::string name_;
    android::base::unique_fd fd_;
};

struct SocketDescriptor {
    std::string name;
    int type = 0;
    uid_t uid = 0;
    gid_t gid = 0;
    int perm = 0;
    std::string context;
    bool passcred = false;
    bool persist = false;

    // Create() creates the named unix domain socket in /dev/socket and returns a Descriptor object.
    // It should be called when starting a service, before calling fork(), such that the socket is
    // synchronously created before starting any other services, which may depend on it.
    Result<Descriptor> Create(const std::string& global_context) const;
};

struct FileDescriptor {
    std::string name;
    std::string type;

    Result<Descriptor> Create() const;
};

struct NamespaceInfo {
    int flags;
    // Pair of namespace type, path to name.
    std::vector<std::pair<int, std::string>> namespaces_to_enter;
};
Result<void> EnterNamespaces(const NamespaceInfo& info, const std::string& name,
                             std::optional<MountNamespace> override_mount_namespace);

struct ProcessAttributes {
    std::string console;
    IoSchedClass ioprio_class;
    int ioprio_pri;
    std::vector<std::pair<int, rlimit>> rlimits;
    uid_t uid;
    gid_t gid;
    std::vector<gid_t> supp_gids;
    int priority;
    bool stdio_to_kmsg;
};
Result<void> SetProcessAttributes(const ProcessAttributes& attr);

Result<void> WritePidToFiles(std::vector<std::string>* files);

}  // namespace init
}  // namespace android
