/** * Callback for reading data from file */ static gboolean read_map_file (struct rspamd_map *map, struct file_map_data *data) { struct map_cb_data cbdata; guchar *bytes; gsize len; rspamd_mempool_t *pool = map->pool; if (map->read_callback == NULL || map->fin_callback == NULL) { msg_err_pool ("bad callback for reading map file"); return FALSE; } if (access (data->filename, R_OK) == -1) { /* File does not exist, skipping */ msg_err_pool ("map file is unavailable for reading"); return FALSE; } bytes = rspamd_file_xmap (data->filename, PROT_READ, &len); if (bytes == NULL) { msg_err_pool ("can't open map %s: %s", data->filename, strerror (errno)); return FALSE; } cbdata.state = 0; cbdata.prev_data = *map->user_data; cbdata.cur_data = NULL; cbdata.map = map; if (map->is_signed) { if (!rspamd_map_check_file_sig (data->filename, map, bytes, len)) { munmap (bytes, len); return FALSE; } } if (len > 0) { map->read_callback (map->pool, bytes, len, &cbdata, TRUE); map->fin_callback (map->pool, &cbdata); *map->user_data = cbdata.cur_data; } munmap (bytes, len); return TRUE; }
/** * Callback for reading data from file */ static gboolean read_map_file (struct rspamd_map *map, struct file_map_data *data, struct rspamd_map_backend *bk, struct map_periodic_cbdata *periodic) { guchar *bytes; gsize len; if (map->read_callback == NULL || map->fin_callback == NULL) { msg_err_map ("bad callback for reading map file"); return FALSE; } if (access (data->filename, R_OK) == -1) { /* File does not exist, skipping */ msg_err_map ("map file is unavailable for reading"); return TRUE; } bytes = rspamd_file_xmap (data->filename, PROT_READ, &len); if (bytes == NULL) { msg_err_map ("can't open map %s: %s", data->filename, strerror (errno)); return FALSE; } if (bk->is_signed) { if (!rspamd_map_check_file_sig (data->filename, map, bk, bytes, len)) { munmap (bytes, len); return FALSE; } } if (len > 0) { map->read_callback (bytes, len, &periodic->cbdata, TRUE); } munmap (bytes, len); return TRUE; }