summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorptt <ptt@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2004-03-28 02:58:51 +0800
committerptt <ptt@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2004-03-28 02:58:51 +0800
commit97aa33dddca788f751a2a53164e2b69f9ea122f8 (patch)
treecd0a94327d412caccec9ccbb453aabcf900f6f44
parenteab7a66c8e9cf65bd6f4dd39f1b550b76b8c0ce7 (diff)
downloadpttbbs-97aa33dddca788f751a2a53164e2b69f9ea122f8.tar
pttbbs-97aa33dddca788f751a2a53164e2b69f9ea122f8.tar.gz
pttbbs-97aa33dddca788f751a2a53164e2b69f9ea122f8.tar.bz2
pttbbs-97aa33dddca788f751a2a53164e2b69f9ea122f8.tar.lz
pttbbs-97aa33dddca788f751a2a53164e2b69f9ea122f8.tar.xz
pttbbs-97aa33dddca788f751a2a53164e2b69f9ea122f8.tar.zst
pttbbs-97aa33dddca788f751a2a53164e2b69f9ea122f8.zip
simplify record.c
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@1616 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r--mbbsd/bbs.c4
-rw-r--r--mbbsd/record.c102
2 files changed, 57 insertions, 49 deletions
diff --git a/mbbsd/bbs.c b/mbbsd/bbs.c
index ac8993b8..d2f15454 100644
--- a/mbbsd/bbs.c
+++ b/mbbsd/bbs.c
@@ -960,7 +960,7 @@ edit_post(int ent, fileheader_t * fhdr, char *direct)
/* rocker.011018: 這裡是不是該檢查一下修改文章後的money和原有的比較? */
if (vedit(genbuf, 0, NULL) != -1) {
- lock_substitute_record(direct, fhdr, sizeof(*fhdr), ent, LOCK_EX);
+ substitute_record(direct, fhdr, sizeof(*fhdr), ent);
setbpath(fpath, currboard);
stampfile(fpath, &postfile);
strlcpy(genbuf, fhdr->filename, sizeof(genbuf));
@@ -997,7 +997,7 @@ edit_post(int ent, fileheader_t * fhdr, char *direct)
strlcpy(fhdr->filename, postfile.filename, sizeof(fhdr->filename));
strlcpy(fhdr->title, save_title, sizeof(fhdr->title));
brc_addlist(postfile.filename);
- lock_substitute_record(direct, fhdr, sizeof(*fhdr), ent, LOCK_UN);
+ substitute_record(direct, fhdr, sizeof(*fhdr), ent);
/* rocker.011018: 順便更新一下cache */
touchdircache(currbid);
diff --git a/mbbsd/record.c b/mbbsd/record.c
index 00568f3e..c56e79e0 100644
--- a/mbbsd/record.c
+++ b/mbbsd/record.c
@@ -5,17 +5,18 @@
#define BUFSIZE 512
static void
-PttLock(int fd, int size, int mode)
+PttLock(int fd, int start, int size, int mode)
{
static struct flock lock_it;
int ret;
lock_it.l_whence = SEEK_CUR;/* from current point */
- lock_it.l_start = 0; /* -"- */
+ lock_it.l_start = start; /* -"- */
lock_it.l_len = size; /* length of data */
lock_it.l_type = mode; /* set exclusive/write lock */
lock_it.l_pid = 0; /* pid not actually interesting */
- while ((ret = fcntl(fd, F_SETLKW, &lock_it)) < 0 && errno == EINTR);
+ while ((ret = fcntl(fd, F_SETLKW, &lock_it)) < 0 && errno == EINTR)
+ sleep(1);
}
#define safewrite write
@@ -96,11 +97,6 @@ get_records(char *fpath, void *rptr, int size, int id, int number)
if (id < 1 || (fd = open(fpath, O_RDONLY, 0)) == -1)
return -1;
- if( flock(fd, LOCK_EX) < 0 ){
- close(fd);
- return -1;
- }
-
if (lseek(fd, (off_t) (size * (id - 1)), SEEK_SET) == -1) {
close(fd);
return 0;
@@ -114,49 +110,17 @@ get_records(char *fpath, void *rptr, int size, int id, int number)
}
int
-lock_substitute_record(char *fpath, void *rptr, int size, int id, int mode)
-{
- static int fd = -1;
- switch( mode ){
- case LOCK_EX:
- if( id < 1 || (fd = open(fpath, O_RDWR | O_CREAT, 0644)) == -1 )
- return -1;
-
- if( flock(fd, LOCK_EX) < 0 ){
- close(fd);
- return -1;
- }
- lseek(fd, (off_t) (size * (id - 1)), SEEK_SET);
- read(fd, rptr, size);
- return 0;
-
- case LOCK_UN:
- if( fd < 0 )
- return -1;
- lseek(fd, (off_t) (size * (id - 1)), SEEK_SET);
- write(fd, rptr, size);
- flock(fd, LOCK_UN);
- close(fd);
- fd = -1;
- return 0;
-
- default:
- return -1;
- }
-}
-
-int
substitute_record(char *fpath, void *rptr, int size, int id)
{
- int fd;
-
+ int fd;
+ int offset=size * (id - 1);
if (id < 1 || (fd = open(fpath, O_WRONLY | O_CREAT, 0644)) == -1)
return -1;
- lseek(fd, (off_t) (size * (id - 1)), SEEK_SET);
- PttLock(fd, size, F_WRLCK);
- safewrite(fd, rptr, size);
- PttLock(fd, size, F_UNLCK);
+ lseek(fd, (off_t) (offset), SEEK_SET);
+ PttLock(fd, offset, size, F_WRLCK);
+ write(fd, rptr, size);
+ PttLock(fd, offset, size, F_UNLCK);
close(fd);
return 0;
@@ -199,6 +163,51 @@ nolfilename(nol_t * n, char *fpath)
int
delete_record(char fpath[], int size, int id)
{
+ char abuf[BUFSIZE];
+ int fi, fo, locksize=0, readsize=0, offset = size * (id - 1), c, d=0;
+ struct stat st;
+
+
+ if ((fi=open(fpath, O_RDONLY, 0)) == -1)
+ return -1;
+
+ if ((fo=open(fpath, O_WRONLY, 0)) == -1)
+ {
+ close(fi);
+ return -1;
+ }
+
+ if(fstat(fi, &st)==-1)
+ { close(fo); close(fi); return -1;}
+
+ locksize = st.st_size - offset;
+ readsize = locksize - size;
+ if (locksize < 0 )
+ { close(fo); close(fi); return -1;}
+
+ PttLock(fo, offset, locksize, F_WRLCK);
+ if(readsize>0)
+ {
+ lseek(fi, offset+size, SEEK_SET);
+ lseek(fo, offset, SEEK_SET);
+ while( d<readsize && (c = read(fi, abuf, BUFSIZE))>0)
+ {
+ write(fo, abuf, c);
+ d=d+c;
+ }
+ }
+ close(fi);
+ ftruncate(fo, st.st_size - size);
+ PttLock(fo, offset, locksize, F_UNLCK);
+ close(fo);
+ return 0;
+
+}
+
+#if 0
+int
+delete_record(char fpath[], int size, int id)
+{
nol_t my;
char abuf[BUFSIZE];
int fdr, fdw, fd;
@@ -249,7 +258,6 @@ delete_record(char fpath[], int size, int id)
return 0;
}
-#if 0
static char *
title_body(char *title)
{