/[LeafOK_CVS]/lbbs/src/file_loader.c
ViewVC logotype

Diff of /lbbs/src/file_loader.c

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

Revision 1.22 by sysadm, Wed Nov 19 03:12:58 2025 UTC Revision 1.26 by sysadm, Fri Dec 19 06:16:27 2025 UTC
# Line 32  struct shm_header_t Line 32  struct shm_header_t
32  int load_file(const char *filename)  int load_file(const char *filename)
33  {  {
34          char filepath[FILE_PATH_LEN];          char filepath[FILE_PATH_LEN];
35            char shm_name[FILE_NAME_LEN];
36          int fd;          int fd;
37          struct stat sb;          struct stat sb;
38          void *p_data;          void *p_data;
# Line 44  int load_file(const char *filename) Line 45  int load_file(const char *filename)
45    
46          if (filename == NULL)          if (filename == NULL)
47          {          {
48                  log_error("NULL pointer error\n");                  log_error("NULL pointer error");
49                  return -1;                  return -1;
50          }          }
51    
52          if ((fd = open(filename, O_RDONLY)) < 0)          if ((fd = open(filename, O_RDONLY)) < 0)
53          {          {
54                  log_error("open(%s) error (%d)\n", filename, errno);                  log_error("open(%s) error (%d)", filename, errno);
55                  return -1;                  return -1;
56          }          }
57    
58          if (fstat(fd, &sb) < 0)          if (fstat(fd, &sb) < 0)
59          {          {
60                  log_error("fstat(fd) error (%d)\n", errno);                  log_error("fstat(fd) error (%d)", errno);
61                  close(fd);                  close(fd);
62                  return -1;                  return -1;
63          }          }
# Line 65  int load_file(const char *filename) Line 66  int load_file(const char *filename)
66          p_data = mmap(NULL, data_len, PROT_READ, MAP_SHARED, fd, 0L);          p_data = mmap(NULL, data_len, PROT_READ, MAP_SHARED, fd, 0L);
67          if (p_data == MAP_FAILED)          if (p_data == MAP_FAILED)
68          {          {
69                  log_error("mmap() error (%d)\n", errno);                  log_error("mmap() error (%d)", errno);
70                  close(fd);                  close(fd);
71                  return -2;                  return -2;
72          }          }
73    
74          if (close(fd) < 0)          if (close(fd) < 0)
75          {          {
76                  log_error("close(fd) error (%d)\n", errno);                  log_error("close(fd) error (%d)", errno);
77                  return -1;                  return -1;
78          }          }
79    
# Line 81  int load_file(const char *filename) Line 82  int load_file(const char *filename)
82          // Allocate shared memory          // Allocate shared memory
83          size = sizeof(struct shm_header_t) + data_len + 1 + sizeof(long) * (size_t)(line_total + 1);          size = sizeof(struct shm_header_t) + data_len + 1 + sizeof(long) * (size_t)(line_total + 1);
84    
85          if (unload_file(filename) < 0)          strncpy(filepath, filename, sizeof(filepath) - 1);
86            filepath[sizeof(filepath) - 1] = '\0';
87            snprintf(shm_name, sizeof(shm_name), "/FILE_SHM_%s", basename(filepath));
88    
89            if (shm_unlink(shm_name) == -1 && errno != ENOENT)
90          {          {
91                    log_error("shm_unlink(%s) error (%d)", shm_name, errno);
92                  return -2;                  return -2;
93          }          }
94    
95          strncpy(filepath, filename, sizeof(filepath) - 1);          if ((fd = shm_open(shm_name, O_CREAT | O_EXCL | O_RDWR, 0600)) == -1)
         filepath[sizeof(filepath) - 1] = '\0';  
   
         if ((fd = shm_open(basename(filepath), O_CREAT | O_EXCL | O_RDWR, 0600)) == -1)  
96          {          {
97                  log_error("shm_open(%s) error (%d)\n", basename(filepath), errno);                  log_error("shm_open(%s) error (%d)", shm_name, errno);
98                  return -2;                  return -2;
99          }          }
100          if (ftruncate(fd, (off_t)size) == -1)          if (ftruncate(fd, (off_t)size) == -1)
101          {          {
102                  log_error("ftruncate(size=%d) error (%d)\n", size, errno);                  log_error("ftruncate(size=%d) error (%d)", size, errno);
103                  close(fd);                  close(fd);
104                  return -2;                  return -2;
105          }          }
# Line 104  int load_file(const char *filename) Line 107  int load_file(const char *filename)
107          p_shm = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0L);          p_shm = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0L);
108          if (p_shm == MAP_FAILED)          if (p_shm == MAP_FAILED)
109          {          {
110                  log_error("mmap() error (%d)\n", errno);                  log_error("mmap() error (%d)", errno);
111                  close(fd);                  close(fd);
112                  return -2;                  return -2;
113          }          }
114    
115          if (close(fd) < 0)          if (close(fd) < 0)
116          {          {
117                  log_error("close(fd) error (%d)\n", errno);                  log_error("close(fd) error (%d)", errno);
118                  return -1;                  return -1;
119          }          }
120    
# Line 122  int load_file(const char *filename) Line 125  int load_file(const char *filename)
125    
126          if (munmap(p_data, data_len) < 0)          if (munmap(p_data, data_len) < 0)
127          {          {
128                  log_error("munmap() error (%d)\n", errno);                  log_error("munmap() error (%d)", errno);
129                  munmap(p_shm, size);                  munmap(p_shm, size);
130                  return -2;                  return -2;
131          }          }
# Line 133  int load_file(const char *filename) Line 136  int load_file(const char *filename)
136    
137          if (munmap(p_shm, size) < 0)          if (munmap(p_shm, size) < 0)
138          {          {
139                  log_error("munmap() error (%d)\n", errno);                  log_error("munmap() error (%d)", errno);
140                  return -2;                  return -2;
141          }          }
142    
# Line 143  int load_file(const char *filename) Line 146  int load_file(const char *filename)
146  int unload_file(const char *filename)  int unload_file(const char *filename)
147  {  {
148          char filepath[FILE_PATH_LEN];          char filepath[FILE_PATH_LEN];
149            char shm_name[FILE_NAME_LEN];
150    
151          if (filename == NULL)          if (filename == NULL)
152          {          {
153                  log_error("NULL pointer error\n");                  log_error("NULL pointer error");
154                  return -1;                  return -1;
155          }          }
156    
157          strncpy(filepath, filename, sizeof(filepath) - 1);          strncpy(filepath, filename, sizeof(filepath) - 1);
158          filepath[sizeof(filepath) - 1] = '\0';          filepath[sizeof(filepath) - 1] = '\0';
159            snprintf(shm_name, sizeof(shm_name), "/FILE_SHM_%s", basename(filepath));
160    
161          if (shm_unlink(basename(filepath)) == -1 && errno != ENOENT)          if (shm_unlink(shm_name) == -1 && errno != ENOENT)
162          {          {
163                  log_error("shm_unlink(%s) error (%d)\n", basename(filepath), errno);                  log_error("shm_unlink(%s) error (%d)", shm_name, errno);
164                  return -2;                  return -2;
165          }          }
166    
# Line 165  int unload_file(const char *filename) Line 170  int unload_file(const char *filename)
170  void *get_file_shm_readonly(const char *filename, size_t *p_data_len, long *p_line_total, const void **pp_data, const long **pp_line_offsets)  void *get_file_shm_readonly(const char *filename, size_t *p_data_len, long *p_line_total, const void **pp_data, const long **pp_line_offsets)
171  {  {
172          char filepath[FILE_PATH_LEN];          char filepath[FILE_PATH_LEN];
173            char shm_name[FILE_NAME_LEN];
174          int fd;          int fd;
175          void *p_shm = NULL;          void *p_shm = NULL;
176          struct stat sb;          struct stat sb;
# Line 172  void *get_file_shm_readonly(const char * Line 178  void *get_file_shm_readonly(const char *
178    
179          if (filename == NULL || p_data_len == NULL || p_line_total == NULL || pp_data == NULL || pp_line_offsets == NULL)          if (filename == NULL || p_data_len == NULL || p_line_total == NULL || pp_data == NULL || pp_line_offsets == NULL)
180          {          {
181                  log_error("NULL pointer error\n");                  log_error("NULL pointer error");
182                  return NULL;                  return NULL;
183          }          }
184    
185          strncpy(filepath, filename, sizeof(filepath) - 1);          strncpy(filepath, filename, sizeof(filepath) - 1);
186          filepath[sizeof(filepath) - 1] = '\0';          filepath[sizeof(filepath) - 1] = '\0';
187            snprintf(shm_name, sizeof(shm_name), "/FILE_SHM_%s", basename(filepath));
188    
189          if ((fd = shm_open(basename(filepath), O_RDONLY, 0600)) == -1)          if ((fd = shm_open(shm_name, O_RDONLY, 0600)) == -1)
190          {          {
191                  log_error("shm_open(%s) error (%d)\n", basename(filepath), errno);                  log_error("shm_open(%s) error (%d)", shm_name, errno);
192                  return NULL;                  return NULL;
193          }          }
194    
195          if (fstat(fd, &sb) < 0)          if (fstat(fd, &sb) < 0)
196          {          {
197                  log_error("fstat(fd) error (%d)\n", errno);                  log_error("fstat(fd) error (%d)", errno);
198                  close(fd);                  close(fd);
199                  return NULL;                  return NULL;
200          }          }
# Line 197  void *get_file_shm_readonly(const char * Line 204  void *get_file_shm_readonly(const char *
204          p_shm = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0L);          p_shm = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0L);
205          if (p_shm == MAP_FAILED)          if (p_shm == MAP_FAILED)
206          {          {
207                  log_error("mmap() error (%d)\n", errno);                  log_error("mmap() error (%d)", errno);
208                  close(fd);                  close(fd);
209                  return NULL;                  return NULL;
210          }          }
211    
212          if (close(fd) < 0)          if (close(fd) < 0)
213          {          {
214                  log_error("close(fd) error (%d)\n", errno);                  log_error("close(fd) error (%d)", errno);
215                  return NULL;                  return NULL;
216          }          }
217    
218          if (((struct shm_header_t *)p_shm)->shm_size != size)          if (((struct shm_header_t *)p_shm)->shm_size != size)
219          {          {
220                  log_error("Shared memory size mismatch (%ld != %ld)\n", ((struct shm_header_t *)p_shm)->shm_size, size);                  log_error("Shared memory size mismatch (%ld != %ld)", ((struct shm_header_t *)p_shm)->shm_size, size);
221                  munmap(p_shm, size);                  munmap(p_shm, size);
222                  return NULL;                  return NULL;
223          }          }
# Line 236  int detach_file_shm(void *p_shm) Line 243  int detach_file_shm(void *p_shm)
243    
244          if (munmap(p_shm, size) < 0)          if (munmap(p_shm, size) < 0)
245          {          {
246                  log_error("munmap() error (%d)\n", errno);                  log_error("munmap() error (%d)", errno);
247                  return -2;                  return -2;
248          }          }
249    


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1