mirror of
https://github.com/fumiama/CMoe-Counter.git
synced 2025-02-13 09:02:38 +01:00
增加文件锁
This commit is contained in:
parent
b1e2cc055f
commit
9f6e6c000b
15
cmoe.c
15
cmoe.c
@ -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.");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user