annotate uip/annosbr.c @ 12:441a2190cfae

Lion fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 21 Apr 2012 13:10:49 +0900
parents a6481689f99c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* annosbr.c - prepend annotation to messages */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 #ifndef lint
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
3 static char ident[] = "@(#)$Id: annosbr.c,v 1.2 2006/12/05 18:18:13 kono Exp $";
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 #endif /* lint */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 #include "../h/mh.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 #include "../zotnet/tws.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 #include <errno.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 #include <sys/types.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 #include <sys/stat.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 off_t lseek ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 static annosbr();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 annotate (file, comp, text, inplace, datesw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 register char *file,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 *comp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 *text;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 int inplace,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 datesw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 if ((fd = lkopen (file, 2)) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 switch (errno) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 case ENOENT:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 admonish (file, "unable to lock and open");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 return 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 i = annosbr (fd, file, comp, text, inplace, datesw);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 #ifndef __CYGWIN32__
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 /* cygwin32 cannot rename() my locked file. X-< */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 (void) lkclose (fd, file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 return i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 static annosbr (src, file, comp, text, inplace, datesw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 register char *file,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 *comp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 *text;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 int src,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 inplace,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 datesw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 int mode,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 register char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 *sp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 char buffer[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 tmpfil[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 register FILE *tmp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 mode = fstat (src, &st) != NOTOK ? (st.st_mode & 0777) : m_gmprot ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 (void) strcpy (tmpfil, m_scratch (file, "annotate"));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 if ((tmp = fopen (tmpfil, "w")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 admonish (tmpfil, "unable to create");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 return 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 (void) chmod (tmpfil, mode);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 if (datesw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 fprintf (tmp, "%s: %s\n", comp, dtimenow ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 if (cp = text) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 do {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 while (*cp == ' ' || *cp == '\t')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 sp = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 while (*cp && *cp++ != '\n')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 if (cp - sp)
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
90 fprintf (tmp, "%s: %*.*s", comp, (int)(cp - sp), (int)(cp - sp), sp);
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 } while (*cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 if (cp[-1] != '\n' && cp != text)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 (void) putc ('\n', tmp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 (void) fflush (tmp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 cpydata (src, fileno (tmp), file, tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 (void) fclose (tmp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 if (inplace) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 if ((fd = open (tmpfil, 0)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 adios (tmpfil, "unable to open for re-reading");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 (void) lseek (src, (off_t)0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 cpydata (fd, src, tmpfil, file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 (void) close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 (void) unlink (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 #ifdef __CYGWIN32__
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 (void) lkclose (src, file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 (void) strcpy (buffer, m_backup (file));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 #ifdef __CYGWIN32__
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 (void) lkclose (src, file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 if (rename (file, buffer) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 switch (errno) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 case ENOENT: /* unlinked early - no annotations */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 (void) unlink (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 admonish (buffer, "unable to rename %s to", file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 return 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 if (rename (tmpfil, file) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 admonish (file, "unable to rename %s to", tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 return 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 }