| /* |
| * Copyright (c) 2000-2001 Silicon Graphics, Inc. |
| * All Rights Reserved. |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License as |
| * published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it would be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| */ |
| |
| #include <stdio.h> |
| #include <unistd.h> |
| #include <stdlib.h> |
| #include <sys/stat.h> |
| #include <limits.h> |
| #include <errno.h> |
| #include <fcntl.h> |
| #include <assert.h> |
| #include <string.h> |
| |
| #include "config.h" |
| |
| #include "types.h" |
| #include "mlog.h" |
| |
| char * |
| open_pathalloc(char *dirname, char *basename, pid_t pid) |
| { |
| size_t dirlen; |
| size_t pidlen; |
| size_t namelen; |
| char *namebuf; |
| |
| if (strcmp(dirname, "/")) { |
| dirlen = strlen(dirname); |
| } else { |
| dirlen = 0; |
| dirname = ""; |
| } |
| |
| /* |
| * We could calculate the length of pid string |
| * = trunc(log10(pid))+1, |
| * but we are restricted to 32 bits for pid anyway. |
| * 32 bits => trunc(log10(2^32))+1 = 10 |
| * And if it ever became 64 bits, |
| * 64 bits => trunc(log10(2^64))+1 = 20 |
| */ |
| if (pid) { |
| pidlen = 1 + 20; |
| } else { |
| pidlen = 0; |
| } |
| namelen = dirlen + 1 + strlen(basename) + pidlen + 1; |
| namebuf = (char *)calloc(1, namelen); |
| assert(namebuf); |
| |
| if (pid) { |
| (void )snprintf(namebuf, namelen, "%s/%s.%d", dirname, basename, pid); |
| } else { |
| (void )snprintf(namebuf, namelen, "%s/%s", dirname, basename); |
| } |
| |
| return namebuf; |
| } |
| |
| int |
| open_trwp(char *pathname) |
| { |
| int fd; |
| |
| fd = open(pathname, O_CREAT | O_TRUNC | O_RDWR, S_IRUSR | S_IWUSR); |
| if (fd < 0) { |
| mlog(MLOG_NORMAL, |
| _("could not create %s: %s\n"), |
| pathname, |
| strerror(errno)); |
| } |
| |
| return fd; |
| } |
| |
| int |
| open_erwp(char *pathname) |
| { |
| int fd; |
| |
| fd = open(pathname, O_EXCL | O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); |
| if (fd < 0) { |
| mlog(MLOG_NORMAL, |
| _("could not create %s: %s\n"), |
| pathname, |
| strerror(errno)); |
| } |
| |
| return fd; |
| } |
| |
| int |
| open_rwp(char *pathname) |
| { |
| int fd; |
| |
| fd = open(pathname, O_RDWR); |
| |
| return fd; |
| } |
| |
| int |
| mkdir_tp(char *pathname) |
| { |
| int rval; |
| |
| rval = mkdir(pathname, S_IRWXU); |
| |
| return rval; |
| } |
| |
| int |
| open_trwdb(char *dirname, char *basename, pid_t pid) |
| { |
| char *pathname; |
| int fd; |
| |
| pathname = open_pathalloc(dirname, basename, pid); |
| fd = open_trwp(pathname); |
| free((void *)pathname); |
| |
| return fd; |
| } |
| |
| int |
| open_erwdb(char *dirname, char *basename, pid_t pid) |
| { |
| char *pathname; |
| int fd; |
| |
| pathname = open_pathalloc(dirname, basename, pid); |
| fd = open_erwp(pathname); |
| free((void *)pathname); |
| |
| return fd; |
| } |
| |
| int |
| open_rwdb(char *dirname, char *basename, pid_t pid) |
| { |
| char *pathname; |
| int fd; |
| |
| pathname = open_pathalloc(dirname, basename, pid); |
| fd = open_rwp(pathname); |
| free((void *)pathname); |
| |
| return fd; |
| } |