]> diplodocus.org Git - nmh/blob - docs/historical/mh-jun-1982/subs/m_file.c
Create new mh-format function %(ordinal)
[nmh] / docs / historical / mh-jun-1982 / subs / m_file.c
1 #ifdef COMMENT
2 Proprietary Rand Corporation, 1981.
3 Further distribution of this software
4 subject to the terms of the Rand
5 license agreement.
6 #endif
7
8 #include "../mh.h"
9 #include "../folder.h"
10 #include <stdio.h>
11 #include <sys/types.h>
12 #include <sys/stat.h>
13 #include <errno.h>
14
15 extern int errno;
16
17 m_file(folder, msg, folders, nfolders, prsrvf, setcur)
18 char *folder;
19 char *msg;
20 struct st_fold folders[];
21 int nfolders;
22 int prsrvf;
23 int setcur;
24 {
25 char newmsg[256], buf[BUFSIZ];
26 register int i;
27 register char *nmsg;
28 register struct st_fold *fp;
29 struct stat stbuf, stbf1;
30 int n, o, linkerr;
31
32 for(fp = folders; fp < &folders[nfolders]; fp++) {
33 if(prsrvf)
34 nmsg = msg;
35 else {
36 if (fp->f_mp->hghmsg >= MAXFOLDER) {
37 fprintf(stderr,
38 "Can't file msg %s -- folder %s is full.\n",
39 msg, fp->f_name);
40 return(1);
41 }
42 nmsg = m_name(fp->f_mp->hghmsg++ + 1);
43 }
44 VOID copy(nmsg, copy("/", copy(m_maildir(fp->f_name), newmsg)));
45 if(link(msg, newmsg) < 0) {
46 linkerr = errno;
47 if(linkerr == EEXIST ||
48 (linkerr == EXDEV && stat(newmsg, &stbuf) != -1)) {
49 if(linkerr != EEXIST || stat(msg, &stbf1) < 0 ||
50 stat(newmsg, &stbuf) < 0 ||
51 stbf1.st_ino != stbuf.st_ino) {
52 fprintf(stderr, "Message %s:%s already exists.\n",
53 fp->f_name, msg);
54 return(1);
55 }
56 continue;
57 }
58 if(linkerr == EXDEV) {
59 if((o = open(msg, 0)) == -1) {
60 fprintf(stderr, "Can't open %s:%s.\n",
61 folder, msg);
62 return(1);
63 }
64 VOID fstat(o, &stbuf);
65 if((n = creat(newmsg, (int)stbuf.st_mode&0777)) == -1) {
66 fprintf(stderr, "Can't create %s:%s.\n",
67 fp->f_name, nmsg);
68 VOID close(o);
69 return(1);
70 }
71 do
72 if((i=read(o, buf, sizeof buf)) < 0 ||
73 write(n, buf, i) == -1) {
74 fprintf(stderr, "Copy error on %s:%s to %s:%s!\n",
75 folder, msg, fp->f_name, nmsg);
76 VOID close(o); VOID close(n);
77 return(1);
78 }
79 while(i == sizeof buf);
80 VOID close(n); VOID close(o);
81 } else {
82 fprintf(stderr, "Error on link %s:%s to %s:",
83 folder, msg, fp->f_name);
84 perror(nmsg);
85 return(1);
86 }
87 }
88 if( setcur
89 && ( (i = atoi(nmsg)) < fp->f_mp->curmsg
90 || !fp->f_mp->curmsg
91 )
92 )
93 fp->f_mp->curmsg = i;
94 }
95 retur