1
0
mirror of https://github.com/fumiama/CMoe-Counter.git synced 2025-02-08 23:09:33 +01:00

增加文件锁

This commit is contained in:
源文雨 2021-06-10 12:03:29 +08:00
parent b1e2cc055f
commit 9f6e6c000b

15
cmoe.c
View File

@ -1,8 +1,9 @@
#include <simple_protobuf.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/file.h>
#include <unistd.h>
#include <simple_protobuf.h>
#include "cmoe.h"
static uint32_t* items_len;
@ -71,14 +72,15 @@ static int del_user(FILE* fp, SIMPLE_PB* spb) {
fseek(fp, this, SEEK_SET);
if(fwrite(data, cap, 1, fp) == 1) {
free(data);
fflush(fp);
return 0;
}
}
}
free(data);
}
return 2;
}
return 2;
}
static int add_user(char* name, uint32_t count, FILE* fp) {
@ -108,6 +110,7 @@ static void return_count(char* name, char* theme) {
FILE* fp = fopen(DATFILE, "rb+");
if(!fp) fp = fopen(DATFILE, "wb+");
if(fp) {
flock(fileno(fp), LOCK_EX);
int ch, exist = 0, user_exist = 0;
while(has_next(fp, ch)) {
SIMPLE_PB *spb = get_pb(fp);
@ -117,7 +120,7 @@ static void return_count(char* name, char* theme) {
else {
if (add_user(d->name, d->count + 1, fp)) http_error(HTTP500, "Add User Error.");
else {
fflush(fp);
fclose(fp);
char cntstr[11];
sprintf(cntstr, "%010u", d->count);
int isbig = 0;
@ -150,7 +153,6 @@ static void return_count(char* name, char* theme) {
fwrite(theme_type[n], len_type[n], 1, stdout);
printf(img_slot_rear);
}
fflush(stdout);
fwrite(svg_tail, sizeof(svg_tail)-1, 1, stdout);
fflush(stdout);
}
@ -160,7 +162,6 @@ static void return_count(char* name, char* theme) {
}
} else free(spb);
}
fclose(fp);
if(!user_exist) http_error(HTTP404, "No Such User.");
} else http_error(HTTP500, "Open File Error.");
}
@ -170,6 +171,7 @@ static int name_exist(char* name) {
if(!fp) fp = fopen(DATFILE, "wb+");
if(fp) {
int ch, exist = 0;
flock(fileno(fp), LOCK_EX);
while(has_next(fp, ch)) {
SIMPLE_PB *spb = get_pb(fp);
COUNTER *d = (COUNTER *)spb->target;
@ -207,11 +209,12 @@ int main(int argc, char **argv) {
else if(!name_exist(name)) {
FILE* fp = fopen(DATFILE, "ab+");
if(fp) {
flock(fileno(fp), LOCK_EX);
add_user(name, 0, fp);
fclose(fp);
char* msg = "<P>Success.\r\n";
headers(strlen(msg), "text/html", 1);
fwrite(msg, strlen(msg), 1, stdout);
fclose(fp);
} else http_error(HTTP500, "Open File Error.");
} else http_error(HTTP400, "Name Exist.");
} else http_error(HTTP400, "Null Register Token.");