1 // SPDX-License-Identifier: MIT or LGPL-2.1-only
2
3 #include <config.h>
4
5 #include <sys/stat.h>
6 #include <sys/ioctl.h>
7 #include <linux/fs.h>
8 #include <fcntl.h>
9 #include <string.h>
10 #include "ublksrv_priv.h"
11
12 /*
13 * We don't need to lock file since the device id is unique
14 */
create_pid_file(const char * pid_file,int * pid_fd)15 int create_pid_file(const char *pid_file, int *pid_fd)
16 {
17 #define PID_PATH_LEN 256
18 char buf[PID_PATH_LEN];
19 int fd, ret;
20
21 fd = open(pid_file, O_RDWR | O_CREAT | O_CLOEXEC,
22 S_IRUSR | S_IWUSR);
23 if (fd < 0) {
24 ublk_err( "Fail to open file %s", pid_file);
25 return fd;
26 }
27
28 ret = ftruncate(fd, 0);
29 if (ret == -1) {
30 ublk_err( "Could not truncate pid file %s, err %s",
31 pid_file, strerror(errno));
32 goto fail;
33 }
34
35 snprintf(buf, PID_PATH_LEN, "%ld\n", (long) getpid());
36 if (write(fd, buf, strlen(buf)) != strlen(buf)) {
37 ublk_err( "Fail to write %s to file %s",
38 buf, pid_file);
39 ret = -1;
40 } else {
41 *pid_fd = fd;
42 }
43 fail:
44 if (ret) {
45 close(fd);
46 unlink(pid_file);
47 }
48 return ret;
49 }
50
ublk_err(const char * fmt,...)51 void ublk_err(const char *fmt, ...)
52 {
53 va_list ap;
54
55 va_start(ap, fmt);
56 vsyslog(LOG_ERR, fmt, ap);
57 }
58
ublk_log(const char * fmt,...)59 void ublk_log(const char *fmt, ...)
60 {
61 va_list ap;
62
63 va_start(ap, fmt);
64 vsyslog(LOG_INFO, fmt, ap);
65 }
66
67 #ifdef DEBUG
68 static unsigned int ublk_debug_mask;
ublk_dbg(int level,const char * fmt,...)69 void ublk_dbg(int level, const char *fmt, ...)
70 {
71 if (level & ublk_debug_mask) {
72 va_list ap;
73
74 va_start(ap, fmt);
75 vsyslog(LOG_ERR, fmt, ap);
76 }
77 }
78
ublk_ctrl_dbg(int level,const char * fmt,...)79 void ublk_ctrl_dbg(int level, const char *fmt, ...)
80 {
81 if (level & ublk_debug_mask) {
82 va_list ap;
83
84 va_start(ap, fmt);
85 vfprintf(stdout, fmt, ap);
86 }
87 }
88
ublk_set_debug_mask(unsigned mask)89 void ublk_set_debug_mask(unsigned mask)
90 {
91 ublk_debug_mask = mask;
92 }
93
ublk_get_debug_mask(unsigned mask)94 unsigned ublk_get_debug_mask(unsigned mask)
95 {
96 return ublk_debug_mask;
97 }
98 #endif
99