summaryrefslogtreecommitdiffstats
path: root/mbbsd/bbs.c
diff options
context:
space:
mode:
authorpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2007-12-02 12:02:48 +0800
committerpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2007-12-02 12:02:48 +0800
commit23d973bd097f2ec285b0d4b1a08dd13f48d5dec1 (patch)
tree93bfc9f9517217df832ae14349a06b5d65d8b67e /mbbsd/bbs.c
parent6dbbad9a294b007ec184b689a601ed8077f4d50b (diff)
downloadpttbbs-23d973bd097f2ec285b0d4b1a08dd13f48d5dec1.tar
pttbbs-23d973bd097f2ec285b0d4b1a08dd13f48d5dec1.tar.gz
pttbbs-23d973bd097f2ec285b0d4b1a08dd13f48d5dec1.tar.bz2
pttbbs-23d973bd097f2ec285b0d4b1a08dd13f48d5dec1.tar.lz
pttbbs-23d973bd097f2ec285b0d4b1a08dd13f48d5dec1.tar.xz
pttbbs-23d973bd097f2ec285b0d4b1a08dd13f48d5dec1.tar.zst
pttbbs-23d973bd097f2ec285b0d4b1a08dd13f48d5dec1.zip
*** IMPORTANT CHANGE ***
BRC v3, supporting local modification THINK TWICE BEFORE YOU APPLY TO YOUR SYSTEM. BRC v3 will double size of BRC v2. BRC v3 can allow notifying changes of comment (recommend) system BRC v3 may cause more syscall activities than v2 git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@3608 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'mbbsd/bbs.c')
-rw-r--r--mbbsd/bbs.c127
1 files changed, 58 insertions, 69 deletions
diff --git a/mbbsd/bbs.c b/mbbsd/bbs.c
index 86fc5d79..80a7bec2 100644
--- a/mbbsd/bbs.c
+++ b/mbbsd/bbs.c
@@ -317,10 +317,23 @@ readtitle(void)
static void
readdoent(int num, fileheader_t * ent)
{
- int type;
+ int type = ' ';
char *mark, *title,
color, special = 0, isonline = 0, recom[8];
- type = brc_unread(currbid, ent->filename) ? '+' : ' ';
+
+ // type = brc_unread(currbid, ent->filename) ? '+' : ' ';
+ switch (brc_unread(currbid, ent->filename, ent->modified))
+ {
+ case 1: // unread
+ type = '+';
+ break;
+ case 2: // unread (modified)
+ type = '~';
+ break;
+ default:
+ break;
+ }
+
if ((currmode & MODE_BOARD) && (ent->filemode & FILE_DIGEST))
type = (type == ' ') ? '*' : '#';
else if (currmode & MODE_BOARD || HasUserPerm(PERM_LOGINOK)) {
@@ -921,15 +934,7 @@ do_general(int isbid)
else if(!isbid)
{
/* general article */
-#ifdef USE_TEXTLEN
- struct stat st;
-
- if (stat(fpath, &st) != -1)
- {
- /* put original file (text) length. */
- postfile.textlen = st.st_size;
- }
-#endif
+ postfile.modified = dasht(fpath);
postfile.multi.money = aborted;
}
@@ -978,7 +983,7 @@ do_general(int isbid)
#endif
outgo_post(&postfile, currboard, cuser.userid, cuser.nickname);
}
- brc_addlist(postfile.filename);
+ brc_addlist(postfile.filename, postfile.modified);
if( !bp->level || (currbrdattr & BRD_POSTMASK))
{
@@ -1261,7 +1266,6 @@ edit_post(int ent, fileheader_t * fhdr, const char *direct)
char genbuf[200];
fileheader_t postfile;
boardheader_t *bp = getbcache(currbid);
- struct stat oldstat, newstat;
int isSysop = 0, recordTouched = 0;
assert(0<=currbid-1 && currbid-1<MAX_BOARD);
@@ -1291,60 +1295,19 @@ edit_post(int ent, fileheader_t * fhdr, const char *direct)
setdirpath(genbuf, direct, fhdr->filename);
local_article = fhdr->filemode & FILE_LOCAL;
-#ifdef USE_TEXTLEN
- if(fhdr->textlen > 0)
- {
- /* TODO SYSOP may need some function to edit entire file. */
- CopyN(genbuf, fpath, fhdr->textlen);
- }
- else
-#endif
- {
- Copy(genbuf, fpath);
- }
-
+ Copy(genbuf, fpath);
strlcpy(save_title, fhdr->title, sizeof(save_title));
do {
- stat(genbuf, &oldstat);
+ time4_t oldmt, newmt;
+ oldmt = dasht(genbuf);
if (vedit(fpath, 0, NULL) == -1)
break;
- stat(genbuf, &newstat);
-
- /* check textlen */
- if(fhdr->textlen > 0)
- {
- int gotnewstat = -1;
-
-#ifdef USE_TEXTLEN
- /* TODO should we reload textlen info?
- * multiple editing will make textlen invalid. */
- if(fhdr->textlen != newstat.st_size)
- {
-#ifdef DEBUG
- vmsg("textlen != st_size, append tail.");
-#endif
- gotnewstat = stat(fpath, &newstat);
-
- /* copy from old content. */
- AppendTail(genbuf, fpath, fhdr->textlen);
- } else {
- gotnewstat = stat(fpath, &newstat);
- }
-#endif
-
- /* now update the record. */
- if(gotnewstat != -1)
- fhdr->textlen = newstat.st_size;
- else
- fhdr->textlen = 0;
-
- recordTouched = 1;
+ newmt = dasht(genbuf);
- } else /* old flavor, no textlen info */
- if (oldstat.st_mtime != newstat.st_mtime)
+ if (oldmt != newmt)
{
if (tolower(getans(
"檔案已被別人修改過,要覆蓋\掉它嗎 [Y/n]?")) == 'n')
@@ -1370,11 +1333,10 @@ edit_post(int ent, fileheader_t * fhdr, const char *direct)
{
int c = 0;
struct tm *ptime;
- time4_t xt = (time4_t)newstat.st_mtime;
fprintf(fp, MSG_SEPERATOR "\n");
fprintf(fp, "以下為被別人修改過的最新內容: ");
- ptime = localtime4(&xt);
+ ptime = localtime4(&newmt);
fprintf(fp,
" (%02d/%02d %02d:%02d)\n",
ptime->tm_mon + 1, ptime->tm_mday,
@@ -1391,6 +1353,14 @@ edit_post(int ent, fileheader_t * fhdr, const char *direct)
Rename(fpath, genbuf);
+ // this is almost always true...
+ // whatever.
+ {
+ time4_t oldm = fhdr->modified;
+ fhdr->modified = dasht(genbuf);
+ recordTouched = (oldm == fhdr->modified) ? 1 : 0;
+ }
+
if(strcmp(save_title, fhdr->title)){
// Ptt: here is the black hole problem
// (try getindex)
@@ -1661,7 +1631,7 @@ read_post(int ent, fileheader_t * fhdr, const char *direct)
else
STATINC(STAT_READPOST_OLD);
}
- brc_addlist(fhdr->filename);
+ brc_addlist(fhdr->filename, fhdr->modified);
strlcpy(currtitle, subject(fhdr->title), sizeof(currtitle));
switch(more_result)
@@ -2094,24 +2064,37 @@ do_add_recommend(const char *direct, fileheader_t *fhdr,
/* This is a solution to avoid most racing (still some), but cost four
* system calls. */
+
if(type == 0 && fhdr->recommend < 100 )
update = 1;
else if(type == 1 && fhdr->recommend > -100)
update = -1;
+
+ // since we want to do 'modification'...
+ fhdr->modified = dasht(path);
- if( update ){
+ if( /* update */ 1){
int fd;
+
//Ptt: update only necessary
if( (fd = open(direct, O_RDWR)) < 0 )
return -1;
- if( lseek(fd, (sizeof(fileheader_t) * (ent - 1) +
- (char *)&fhdr->recommend - (char *)fhdr),
- SEEK_SET) >= 0 ){
+
+ if (lseek(fd, (sizeof(fileheader_t) * (ent-1) +
+ (char*)&fhdr->modified - (char*)fhdr), SEEK_SET) >= 0)
+ {
+ write(fd, &fhdr->modified, sizeof(fhdr->modified));
+ }
+
+ if( update &&
+ lseek(fd, (sizeof(fileheader_t) * (ent - 1) +
+ (char *)&fhdr->recommend - (char *)fhdr),
+ SEEK_SET) >= 0 ){
// 如果 lseek 失敗就不會 write
- read(fd, &fhdr->recommend, sizeof(char));
+ read(fd, &fhdr->recommend, sizeof(fhdr->recommend));
fhdr->recommend += update;
lseek(fd, -1, SEEK_CUR);
- write(fd, &fhdr->recommend, sizeof(char));
+ write(fd, &fhdr->recommend, sizeof(fhdr->recommend));
}
close(fd);
}
@@ -2419,7 +2402,12 @@ recommend(int ent, fileheader_t * fhdr, const char *direct)
// owner recommend
type = 2;
move(b_lines-1, 0); clrtoeol();
+#ifndef OLDRECOMMEND
+ outs("作者本人, 使用 → 加註方式\n");
+#else
outs("作者本人首推, 使用 → 加註方式\n");
+#endif
+
}
#ifndef DEBUG
else if (!(currmode & MODE_BOARD) &&
@@ -3662,7 +3650,8 @@ const onekey_t read_comms[] = {
{ 1, push_bottom }, // Ctrl('Z') 26
{ 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL },
{ 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL },
- { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL },
+ { 1, recommend }, // '%' (m3itoc style)
+ { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL },
{ 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL },
{ 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL },
{ 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL }, { 0, NULL },