xref: /aosp_15_r20/external/ublksrv/lib/utils.c (revision 94c4a1e103eb1715230460aab379dff275992c20)
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