/** @file

  Definitions for the Lockfile class.

  @section license License

  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you 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 "tscore/ink_defs.h"
#include "tscore/ink_string.h"

#define COP_LOCK     "cop.lock"
#define MANAGER_LOCK "manager.lock"
#define SERVER_LOCK  "server.lock"

class Lockfile
{
public:
  Lockfile() { fname[0] = '\0'; }
  // coverity[uninit_member]
  Lockfile(const char *filename) { ink_strlcpy(fname, filename, sizeof(fname)); }
  ~Lockfile() {}
  void
  SetLockfileName(const char *filename)
  {
    ink_strlcpy(fname, filename, sizeof(fname));
  }

  const char *
  GetLockfileName()
  {
    return fname;
  }

  // Open()
  //
  // Tries to open a lock file, returning:
  //   -errno on error
  //   0 if someone is holding the lock (with holding_pid set)
  //   1 if we now have a writable lock file
  int Open(pid_t *holding_pid);

  // Get()
  //
  // Gets write access to a lock file, and if successful, truncates
  // file, and writes the current process ID.  Returns:
  //   -errno on error
  //   0 if someone is holding the lock (with holding_pid set)
  //   1 if we now have a writable lock file
  int Get(pid_t *holding_pid);

  // Close()
  //
  // Closes the file handle on the opened Lockfile.
  void Close();

  // Kill()
  // KillGroup()
  //
  // Ensures no one is holding the lock. It tries to open the lock file
  // and if that does not succeed, it kills the process holding the lock.
  // If the lock file open succeeds, it closes the lock file releasing
  // the lock.
  //
  // The initial signal can be used to generate a core from the process while
  // still ensuring it dies.
  void Kill(int sig, int initial_sig = 0, const char *pname = nullptr);
  void KillGroup(int sig, int initial_sig = 0, const char *pname = nullptr);

private:
  char fname[PATH_NAME_MAX];
  int  fd = 0;
};
