/*
* LGPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of the
* License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see .
*
* LGPL HEADER END
*
* Copyright 2020, DataDirect Networks Storage.
*/
#include
#include
#include
#include
#include
#include
#include "pid_file.h"
int create_pid_file(const char *path)
{
char buf[3 * sizeof(long long) + 2];
size_t buf_len;
int fd = -1;
int rc2;
fd = open(path, O_RDWR|O_CREAT|O_CLOEXEC, 0600);
if (fd < 0) {
fprintf(stderr, "%s: cannot open '%s': %s\n",
program_invocation_short_name, path, strerror(errno));
return -1;
}
struct flock fl = {
.l_type = F_WRLCK,
.l_whence = SEEK_SET,
};
rc2 = fcntl(fd, F_SETLK, &fl);
if (rc2 < 0) {
fprintf(stderr, "%s: cannot lock '%s': %s\n",
program_invocation_short_name, path, strerror(errno));
goto out;
}
rc2 = ftruncate(fd, 0);
if (rc2 < 0) {
fprintf(stderr, "%s: cannot truncate '%s': %s\n",
program_invocation_short_name, path, strerror(errno));
goto out;
}
buf_len = snprintf(buf, sizeof(buf), "%lld\n", (long long)getpid());
rc2 = write(fd, buf, buf_len);
if (rc2 < 0) {
fprintf(stderr, "%s: cannot write '%s': %s\n",
program_invocation_short_name, path, strerror(errno));
goto out;
}
out:
if (rc2 < 0 && !(fd < 0)) {
close(fd);
fd = -1;
}
return fd;
}