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