1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
/* ----------------------------------------------------- */
/* hdr_stamp - create unique HDR based on timestamp */
/* ----------------------------------------------------- */
/* fpath - directory */
/* token - (A / F / 0) | [HDR_LINK / HDR_COPY] */
/* ----------------------------------------------------- */
/* return : open() fd (not close yet) or link() result */
/* ----------------------------------------------------- */
#include "dao.h"
#include <fcntl.h>
#include <errno.h>
#if 0 /* itoc.030303.註解: 簡易說明 */
hdr_stamp() 會做出一個新的 HDR,依傳入的 token 不同而有差異:
0 : 新增一篇信件(family 是 @),回傳的 fpath 是 hdr 所指向
和 hdr_fpath(fpath, folder, hdr); 所產生的 fpath 相同
'A': 新增一篇文章(family 是 A),回傳的 fpath 是 hdr 所指向
和 hdr_fpath(fpath, folder, hdr); 所產生的 fpath 相同
'F': 新增一個卷宗(family 是 F),回傳的 fpath 是 hdr 所指向
和 hdr_fpath(fpath, folder, hdr); 所產生的 fpath 相同
HDR_LINK : fpath 已有舊檔案時,要複製舊檔案到新信件(family 是 @) 去
並將 hdr 指向這篇新信件,回傳的 fpath 是原來舊檔案
舊檔案和新信件是 hard link,改了其中一篇,另一篇也會一起被改
刪除舊檔案,新信件並不會被刪除
HDR_LINK | 'A': fpath 已有舊檔案時,要複製舊檔案到新文章(family 是 A) 去
並將 hdr 指向這篇新文章,回傳的 fpath 是原來舊檔案
舊檔案和新文章是 hard link,改了其中一篇,另一篇也會一起被改
刪除舊檔案,新文章並不會被刪除
HDR_COPY : fpath 已有舊檔案時,要複製舊檔案到新信件(family 是 @) 去
並將 hdr 指向這篇新信件,回傳的 fpath 是原來舊檔案
舊檔案和新信件是 copy,改了其中一篇,另一篇並不會被改
舊檔案與新信件是完全獨立不相關的二個檔案
HDR_COPY | 'A': fpath 已有舊檔案時,要複製舊檔案到新文章(family 是 A) 去
並將 hdr 指向這篇新文章,回傳的 fpath 是原來舊檔案
舊檔案和新文章是 copy,改了其中一篇,另一篇並不會被改
舊檔案與新文章是完全獨立不相關的二個檔案
#endif
int
hdr_stamp(folder, token, hdr, fpath)
char *folder;
int token;
HDR *hdr;
char *fpath;
{
char *fname, *family;
int rc, chrono;
char *flink, buf[128];
flink = NULL;
if (token & (HDR_LINK | HDR_COPY))
{
flink = fpath;
fpath = buf;
}
fname = fpath;
while (rc = *folder++)
{
*fname++ = rc;
if (rc == '/')
family = fname;
}
if (*family != '.')
{
fname = family;
family -= 2;
}
else
{
fname = family + 1;
*fname++ = '/';
}
if (rc = token & 0xdf) /* 變大寫 */
{
*fname++ = rc;
}
else
{
*fname = *family = '@';
family = ++fname;
}
chrono = time(0);
for (;;)
{
*family = radix32[chrono & 31];
archiv32(chrono, fname);
if (flink)
{
if (token & HDR_LINK)
rc = f_ln(flink, fpath);
else
rc = f_cp(flink, fpath, O_EXCL);
}
else
{
rc = open(fpath, O_WRONLY | O_CREAT | O_EXCL, 0600);
}
if (rc >= 0)
{
memset(hdr, 0, sizeof(HDR));
hdr->chrono = chrono;
str_stamp(hdr->date, &hdr->chrono);
strcpy(hdr->xname, --fname);
break;
}
if (errno != EEXIST)
break;
chrono++;
}
return rc;
}
|