Added acquire/release functions to reuse
This commit is contained in:
parent
65096b1987
commit
d5f0e478e1
2
Makefile
2
Makefile
@ -13,6 +13,8 @@ OBJ_FILES := $(patsubst %.c,$(BD)/%.o,$(SRC_FILES))
|
|||||||
OBJ_FILES := $(patsubst %.c,$(BD)/%.o,$(SRC_FILES))
|
OBJ_FILES := $(patsubst %.c,$(BD)/%.o,$(SRC_FILES))
|
||||||
SHARED_OBJ_FILES := $(patsubst %.c,$(SBD)/%.o,$(SRC_FILES))
|
SHARED_OBJ_FILES := $(patsubst %.c,$(SBD)/%.o,$(SRC_FILES))
|
||||||
|
|
||||||
|
CFLAGS ?= -O2 -ansi -pedantic
|
||||||
|
|
||||||
shared: $(SBD)/$(SHARED_LIB)
|
shared: $(SBD)/$(SHARED_LIB)
|
||||||
static: $(BD)/$(STATIC_LIB)
|
static: $(BD)/$(STATIC_LIB)
|
||||||
|
|
||||||
|
@ -84,6 +84,43 @@ deserialize_header(int fd, CommentHeader *header)
|
|||||||
|
|
||||||
/* TODO: validate driver_data_ptr */
|
/* TODO: validate driver_data_ptr */
|
||||||
|
|
||||||
|
FILE *
|
||||||
|
acquire_id_ctrl_file(char *id_ctrl_file_path)
|
||||||
|
{
|
||||||
|
FILE *retval;
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
retval = NULL;
|
||||||
|
|
||||||
|
if (!(retval = fopen(id_ctrl_file_path, "r+"))) {
|
||||||
|
goto defer;
|
||||||
|
}
|
||||||
|
|
||||||
|
fd = fileno(retval);
|
||||||
|
|
||||||
|
if (lockf(fd, F_LOCK, 0) < 0) {
|
||||||
|
fclose(retval);
|
||||||
|
retval = NULL;
|
||||||
|
goto defer;
|
||||||
|
}
|
||||||
|
|
||||||
|
defer:
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
release_id_ctrl_file(FILE *id_ctrl_file)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
fd = fileno(id_ctrl_file);
|
||||||
|
if (lockf(fd, F_ULOCK, 0) < 0) {
|
||||||
|
fclose(id_ctrl_file);
|
||||||
|
return -ENOLCK;
|
||||||
|
}
|
||||||
|
return fclose(id_ctrl_file);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
unix_fs_driver_leave_comment(void *driver_data_ptr, const CommentHeader *header, const char *text)
|
unix_fs_driver_leave_comment(void *driver_data_ptr, const CommentHeader *header, const char *text)
|
||||||
{
|
{
|
||||||
@ -114,21 +151,11 @@ unix_fs_driver_leave_comment(void *driver_data_ptr, const CommentHeader *header,
|
|||||||
goto defer;
|
goto defer;
|
||||||
}
|
}
|
||||||
|
|
||||||
id_ctrl_file = fopen(id_ctrl_file_path, "r+");
|
if (!(id_ctrl_file = acquire_id_ctrl_file(id_ctrl_file_path))) {
|
||||||
|
|
||||||
if (!id_ctrl_file) {
|
|
||||||
retval = -EIO;
|
retval = -EIO;
|
||||||
goto defer;
|
goto defer;
|
||||||
}
|
}
|
||||||
|
|
||||||
id_ctrl_fd = fileno(id_ctrl_file);
|
|
||||||
|
|
||||||
if (lockf(id_ctrl_fd, F_LOCK, 0) < 0) {
|
|
||||||
id_ctrl_fd = -1;
|
|
||||||
retval = -EIO;
|
|
||||||
goto defer;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fscanf(id_ctrl_file, "%d", &max_id) != 1) {
|
if (fscanf(id_ctrl_file, "%d", &max_id) != 1) {
|
||||||
max_id = 1;
|
max_id = 1;
|
||||||
}
|
}
|
||||||
@ -161,22 +188,18 @@ unix_fs_driver_leave_comment(void *driver_data_ptr, const CommentHeader *header,
|
|||||||
if (retval < 0) {
|
if (retval < 0) {
|
||||||
goto defer;
|
goto defer;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(id_ctrl_file = freopen(id_ctrl_file_path, "w+", id_ctrl_file))) {
|
rewind(id_ctrl_file);
|
||||||
retval = -EIO;
|
|
||||||
goto defer;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(id_ctrl_file, "%d", max_id + 1); /* update id only on success */
|
fprintf(id_ctrl_file, "%d", max_id + 1); /* update id only on success */
|
||||||
retval = max_id + 1;
|
retval = max_id + 1;
|
||||||
defer:
|
defer:
|
||||||
if (id_ctrl_fd >= 0) {
|
if (id_ctrl_file) {
|
||||||
if (lockf(id_ctrl_fd, F_ULOCK, 0) < 0) {
|
if (release_id_ctrl_file(id_ctrl_file) < 0) {
|
||||||
fprintf(stderr, "Failed to release id control lock, aborting...\n");
|
fprintf(stderr, "Failed to release id control file, aborting...\n");
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (id_ctrl_file) fclose(id_ctrl_file);
|
|
||||||
free(id_ctrl_file_path);
|
free(id_ctrl_file_path);
|
||||||
free(header_file_path);
|
free(header_file_path);
|
||||||
free(text_file_path);
|
free(text_file_path);
|
||||||
|
Loading…
Reference in New Issue
Block a user