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