/[zanavi_public1]/navit/navit/maptool/tempfile.c
ZANavi

Diff of /navit/navit/maptool/tempfile.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 56 Revision 57
43 ret = fopen(buffer, "wb+"); 43 ret = fopen(buffer, "wb+");
44 break; 44 break;
45 case 2: 45 case 2:
46 ret = fopen(buffer, "ab"); 46 ret = fopen(buffer, "ab");
47 break; 47 break;
48 case 13:
49 ret = fopen(buffer, "rb+");
50 break;
48 } 51 }
49 52
50 if (debug_itembin(6)) 53 if (debug_itembin(6))
51 { 54 {
52 fprintf(stderr, "== tempfile == open == FILENAME: %s FILEPOINTER: %p ==\n", buffer, ret); 55 fprintf(stderr, "== tempfile == open == FILENAME: %s FILEPOINTER: %p ==\n", buffer, ret);
58 61
59void tempfile_unlink(char *suffix, char *name) 62void tempfile_unlink(char *suffix, char *name)
60{ 63{
61 char buffer[4096]; 64 char buffer[4096];
62 sprintf(buffer, "%s_%s.tmp", name, suffix); 65 sprintf(buffer, "%s_%s.tmp", name, suffix);
66
67 //fprintf(stderr, "== tempfile == unlink == FILENAME: %s ==\n", buffer);
68
63 unlink(buffer); 69 unlink(buffer);
64} 70}
65 71
66void tempfile_rename(char *suffix, char *from, char *to) 72void tempfile_rename(char *suffix, char *from, char *to)
67{ 73{
68 char buffer_from[4096], buffer_to[4096]; 74 char buffer_from[4096], buffer_to[4096];
69 sprintf(buffer_from, "%s_%s.tmp", from, suffix); 75 sprintf(buffer_from, "%s_%s.tmp", from, suffix);
70 sprintf(buffer_to, "%s_%s.tmp", to, suffix); 76 sprintf(buffer_to, "%s_%s.tmp", to, suffix);
77
78 //fprintf(stderr, "== tempfile == rename == FILENAME FROM: %s FILENAME TO: %s ==\n", buffer_from, buffer_to);
79
71 dbg_assert(rename(buffer_from, buffer_to) == 0); 80 dbg_assert(rename(buffer_from, buffer_to) == 0);
72} 81}
73 82
83
84#include <fcntl.h>
85#include <errno.h>
86int tempfile_cp(const char *to, const char *from)
87{
88 int fd_to, fd_from;
89 char buf[4096];
90 ssize_t nread;
91 int saved_errno;
92
93 fd_from = open(from, O_RDONLY);
94 if (fd_from < 0)
95 {
96 return -1;
97 }
98
99 fd_to = open(to, O_WRONLY | O_CREAT | O_EXCL, 0666);
100 if (fd_to < 0)
101 {
102 goto out_error;
103 }
104
105 while (nread = read(fd_from, buf, sizeof buf), nread > 0)
106 {
107 char *out_ptr = buf;
108 ssize_t nwritten;
109
110 do {
111 nwritten = write(fd_to, out_ptr, nread);
112
113 if (nwritten >= 0)
114 {
115 nread -= nwritten;
116 out_ptr += nwritten;
117 }
118 else if (errno != EINTR)
119 {
120 goto out_error;
121 }
122 } while (nread > 0);
123 }
124
125 if (nread == 0)
126 {
127 if (close(fd_to) < 0)
128 {
129 fd_to = -1;
130 goto out_error;
131 }
132 close(fd_from);
133
134 /* Success! */
135 return 0;
136 }
137
138 out_error:
139 saved_errno = errno;
140
141 close(fd_from);
142 if (fd_to >= 0)
143 {
144 close(fd_to);
145 }
146
147 errno = saved_errno;
148 return -1;
149}
150
151void tempfile_copyrename(char *suffix, char *from, char *to)
152{
153 char buffer_from[4096], buffer_to[4096];
154 sprintf(buffer_from, "%s_%s.tmp", from, suffix);
155 sprintf(buffer_to, "%s_%s.tmp", to, suffix);
156
157 //fprintf(stderr, "== tempfile == copyrename == FILENAME FROM: %s FILENAME TO: %s ==\n", buffer_from, buffer_to);
158
159 tempfile_cp(buffer_to, buffer_from);
160 unlink(buffer_from);
161}
162

Legend:
Removed from v.56  
changed lines
  Added in v.57

   
Visit the ZANavi Wiki