#include "copyright.h"
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <errno.h>
#include <event.h>
#include <string.h>
#include <sys/file.h>
#include <stdint.h>
#include "debug.h"
Include dependency graph for mmdb.c:
Go to the source code of this file.
Data Structures | |
struct | mmdb_t |
Functions | |
mmdb_t * | mmdb_open_read (char *filename) |
mmdb_t * | mmdb_open_write (char *filename) |
void | mmdb_resize (struct mmdb_t *mmdb, int length) |
void | mmdb_close (struct mmdb_t *mmdb) |
void | mmdb_write (struct mmdb_t *mmdb, void *data, int length) |
void | mmdb_write_uint32 (struct mmdb_t *mmdb, uint32_t data) |
uint32_t | mmdb_read_uint32 (struct mmdb_t *mmdb) |
unsigned int | mmdb_read_uint (struct mmdb_t *mmdb) |
void | mmdb_write_uint (struct mmdb_t *mmdb, unsigned int val) |
void | mmdb_write_uint64 (struct mmdb_t *mmdb, uint64_t data) |
uint64_t | mmdb_read_uint64 (struct mmdb_t *mmdb) |
void | mmdb_write_single (struct mmdb_t *mmdb, float data) |
float | mmdb_read_single (struct mmdb_t *mmdb) |
void | mmdb_write_double (struct mmdb_t *mmdb, double data) |
double | mmdb_read_double (struct mmdb_t *mmdb) |
void * | mmdb_read (struct mmdb_t *mmdb, void *dest, int length) |
void | mmdb_write_opaque (struct mmdb_t *mmdb, void *data, int length) |
void | mmdb_write_string (struct mmdb_t *mmdb, void *data) |
char * | mmdb_read_string (struct mmdb_t *mmdb) |
char | mmdb_read_opaque (struct mmdb_t *mmdb, void *dest, int maxlength) |
void mmdb_close | ( | struct mmdb_t * | mmdb | ) |
Definition at line 112 of file mmdb.c.
References mmdb_t::base, dprintk, mmdb_t::fd, mmdb_t::length, and mmdb_t::ppos.
Referenced by dump_restart_db_xdr(), and load_restart_db_xdr().
00113 { 00114 msync(mmdb->base, mmdb->length, MS_SYNC); 00115 munmap(mmdb->base, mmdb->length); 00116 ftruncate(mmdb->fd, mmdb->ppos - mmdb->base); 00117 dprintk("truncating to %d bytes.", mmdb->ppos - mmdb->base); 00118 close(mmdb->fd); 00119 mmdb->fd = 0; 00120 memset(mmdb, 0, sizeof(struct mmdb_t)); 00121 free(mmdb); 00122 }
struct mmdb_t* mmdb_open_read | ( | char * | filename | ) |
Definition at line 32 of file mmdb.c.
References mmdb_t::base, mmdb_t::end, mmdb_t::fd, mmdb_t::length, and mmdb_t::ppos.
Referenced by load_restart_db_xdr(), and mmdb_db_read().
00033 { 00034 struct stat statbuf; 00035 struct mmdb_t *mmdb; 00036 int fd, length; 00037 00038 if(stat(filename, &statbuf) < 0) { 00039 return NULL; 00040 } 00041 mmdb = malloc(sizeof(struct mmdb_t)); 00042 if(!mmdb) return NULL; 00043 00044 fd = open(filename, O_RDONLY); 00045 if(!fd) { 00046 free(mmdb); 00047 return NULL; 00048 } 00049 00050 mmdb->fd = fd; 00051 mmdb->length = (statbuf.st_size + 0x3FF) & ~(0x3FF); 00052 mmdb->base = 00053 mmap(NULL, mmdb->length, PROT_READ, MAP_SHARED, 00054 mmdb->fd, 0); 00055 if(!mmdb->base) { 00056 close(mmdb->fd); 00057 free(mmdb); 00058 return NULL; 00059 } 00060 mmdb->end = mmdb->base + mmdb->length; 00061 00062 mmdb->ppos = mmdb->base; 00063 return mmdb; 00064 00065 }
struct mmdb_t* mmdb_open_write | ( | char * | filename | ) |
Definition at line 67 of file mmdb.c.
References mmdb_t::base, dperror, dprintk, mmdb_t::end, mmdb_t::fd, mmdb_t::length, and mmdb_t::ppos.
Referenced by dump_restart_db_xdr(), and mmdb_db_write().
00068 { 00069 struct stat statbuf; 00070 struct mmdb_t *mmdb; 00071 int fd, length; 00072 00073 mmdb = malloc(sizeof(struct mmdb_t)); 00074 dperror((fd = open(filename, O_RDWR | O_CREAT, 0644)) < 0); 00075 00076 mmdb->fd = fd; 00077 mmdb->length = 0x400 * 16; 00078 mmdb->base = NULL; 00079 mmdb->ppos = NULL; 00080 dprintk("mmdb->length %d", mmdb->length); 00081 ftruncate(mmdb->fd, mmdb->length); 00082 fsync(mmdb->fd); 00083 mmdb->base = 00084 mmap(NULL, mmdb->length, PROT_READ | PROT_WRITE, MAP_SHARED, mmdb->fd, 00085 0); 00086 dperror(mmdb->base == MAP_FAILED); 00087 mmdb->end = mmdb->base + mmdb->length; 00088 mmdb->ppos = mmdb->base; 00089 return mmdb; 00090 }
void* mmdb_read | ( | struct mmdb_t * | mmdb, | |
void * | dest, | |||
int | length | |||
) |
Definition at line 199 of file mmdb.c.
References mmdb_t::end, and mmdb_t::ppos.
Referenced by mmdb_db_read(), and mmdb_read_string().
00200 { 00201 if((mmdb->end - mmdb->ppos) < length) 00202 return NULL; 00203 memcpy(dest, mmdb->ppos, length); 00204 mmdb->ppos += length; 00205 if(length & 3) 00206 mmdb->ppos += 4 - (length & 3); 00207 return dest; 00208 }
double mmdb_read_double | ( | struct mmdb_t * | mmdb | ) |
Definition at line 191 of file mmdb.c.
References mmdb_t::ppos.
00192 { 00193 double data = *((double *) (mmdb->ppos)); 00194 mmdb->ppos += sizeof(double); 00195 return ntohl(data); 00196 }
char mmdb_read_opaque | ( | struct mmdb_t * | mmdb, | |
void * | dest, | |||
int | maxlength | |||
) |
Definition at line 237 of file mmdb.c.
References mmdb_t::end, mmdb_t::length, mmdb_read_uint32(), and mmdb_t::ppos.
Referenced by load_restart_db_xdr().
00237 { 00238 int length = mmdb_read_uint32(mmdb); 00239 00240 if((mmdb->end - mmdb->ppos) < length) 00241 return NULL; 00242 if(length > maxlength) { 00243 memcpy(dest, mmdb->ppos, maxlength); 00244 } else { 00245 memcpy(dest, mmdb->ppos, length); 00246 } 00247 mmdb->ppos += length; 00248 if(length & 3) 00249 mmdb->ppos += 4 - (length & 3); 00250 return dest; 00251 }
float mmdb_read_single | ( | struct mmdb_t * | mmdb | ) |
Definition at line 178 of file mmdb.c.
References mmdb_t::ppos.
00179 { 00180 float data = *((float *) (mmdb->ppos)); 00181 mmdb->ppos += sizeof(float); 00182 return ntohl(data); 00183 }
char* mmdb_read_string | ( | struct mmdb_t * | mmdb | ) |
Definition at line 227 of file mmdb.c.
References mmdb_t::length, mmdb_read(), and mmdb_read_uint32().
Referenced by load_bqe(), and load_restart_db_xdr().
00227 { 00228 char *tmp; 00229 int length; 00230 length = mmdb_read_uint32(mmdb); 00231 if(length == 0) return NULL; 00232 tmp = malloc(length); 00233 mmdb_read(mmdb, tmp, length); 00234 return tmp; 00235 }
unsigned int mmdb_read_uint | ( | struct mmdb_t * | mmdb | ) |
Definition at line 146 of file mmdb.c.
References mmdb_read_uint32(), and printk.
00146 { 00147 printk("This function is deprecated, please use mmdb_read_uint32 instead.\n"); 00148 return (unsigned int)mmdb_read_uint32(mmdb); 00149 }
uint32_t mmdb_read_uint32 | ( | struct mmdb_t * | mmdb | ) |
Definition at line 139 of file mmdb.c.
References mmdb_t::ppos.
Referenced by cque_load_restart(), load_bqe(), load_objqe(), load_restart_db_xdr(), mmdb_db_read(), mmdb_read_opaque(), mmdb_read_string(), and mmdb_read_uint().
00140 { 00141 uint32_t data = *((uint32_t *) (mmdb->ppos)); 00142 mmdb->ppos += sizeof(uint32_t); 00143 return ntohl(data); 00144 }
uint64_t mmdb_read_uint64 | ( | struct mmdb_t * | mmdb | ) |
void mmdb_resize | ( | struct mmdb_t * | mmdb, | |
int | length | |||
) |
Definition at line 92 of file mmdb.c.
References mmdb_t::base, dperror, mmdb_t::end, mmdb_t::fd, mmdb_t::length, and mmdb_t::ppos.
Referenced by mmdb_write().
00093 { 00094 int offset = 0; 00095 if(mmdb->base) { 00096 offset = mmdb->ppos - mmdb->base; 00097 msync(mmdb->base, mmdb->length, MS_ASYNC); 00098 munmap(mmdb->base, mmdb->length); 00099 mmdb->base = NULL; 00100 mmdb->ppos = NULL; 00101 } 00102 mmdb->length = (length + 0x3FF) & ~(0x3FF); 00103 ftruncate(mmdb->fd, mmdb->length); 00104 mmdb->base = 00105 mmap(NULL, mmdb->length, PROT_READ | PROT_WRITE, MAP_SHARED, mmdb->fd, 00106 0); 00107 dperror(mmdb->base == NULL); 00108 mmdb->end = mmdb->base + mmdb->length; 00109 mmdb->ppos = mmdb->base + offset; 00110 }
void mmdb_write | ( | struct mmdb_t * | mmdb, | |
void * | data, | |||
int | length | |||
) |
Definition at line 124 of file mmdb.c.
References mmdb_t::end, mmdb_t::length, mmdb_resize(), and mmdb_t::ppos.
Referenced by mmdb_write_double(), mmdb_write_opaque(), mmdb_write_single(), mmdb_write_uint32(), and mmdb_write_uint64().
00125 { 00126 if(mmdb->end - mmdb->ppos < length) { 00127 mmdb_resize(mmdb, mmdb->length + length); 00128 } 00129 memcpy(mmdb->ppos, data, length); 00130 mmdb->ppos += length; 00131 }
void mmdb_write_double | ( | struct mmdb_t * | mmdb, | |
double | data | |||
) |
Definition at line 185 of file mmdb.c.
References mmdb_write().
00186 { 00187 data = htonl(data); 00188 mmdb_write(mmdb, &data, sizeof(double)); 00189 }
void mmdb_write_opaque | ( | struct mmdb_t * | mmdb, | |
void * | data, | |||
int | length | |||
) |
Definition at line 210 of file mmdb.c.
References mmdb_write(), and mmdb_write_uint32().
Referenced by do_save_com_xdr(), mmdb_db_write(), mmdb_write_object(), mmdb_write_string(), and mmdb_write_vattr().
00211 { 00212 unsigned char *pad = (unsigned char *)"\x00\x00\x00\x00"; 00213 mmdb_write_uint32(mmdb, length); 00214 mmdb_write(mmdb, data, length); 00215 if((length & 3) > 0) 00216 mmdb_write(mmdb, pad, 4 - (length & 3)); 00217 }
void mmdb_write_single | ( | struct mmdb_t * | mmdb, | |
float | data | |||
) |
Definition at line 172 of file mmdb.c.
References mmdb_write().
00173 { 00174 data = htonl(data); 00175 mmdb_write(mmdb, &data, sizeof(float)); 00176 }
void mmdb_write_string | ( | struct mmdb_t * | mmdb, | |
void * | data | |||
) |
Definition at line 219 of file mmdb.c.
References mmdb_write_opaque(), and mmdb_write_uint32().
Referenced by dump_bqe(), and dump_restart_db_xdr().
00219 { 00220 if(data == NULL) { 00221 mmdb_write_uint32(mmdb, 0); 00222 } else { 00223 mmdb_write_opaque(mmdb, data, strlen(data)+1); 00224 } 00225 }
void mmdb_write_uint | ( | struct mmdb_t * | mmdb, | |
unsigned int | val | |||
) |
Definition at line 151 of file mmdb.c.
References mmdb_write_uint32(), and printk.
Referenced by mmdb_db_write(), mmdb_write_object(), and mmdb_write_vattr().
00151 { 00152 printk("This function is deprecated, please use mmdb_write_uint32 instead.\n"); 00153 mmdb_write_uint32(mmdb, (uint32_t)val); 00154 return; 00155 }
void mmdb_write_uint32 | ( | struct mmdb_t * | mmdb, | |
uint32_t | data | |||
) |
Definition at line 133 of file mmdb.c.
References mmdb_write().
Referenced by cque_dump_restart(), do_save_com_xdr(), dump_bqe(), dump_objqe(), dump_restart_db_xdr(), mmdb_db_write(), mmdb_write_opaque(), mmdb_write_string(), and mmdb_write_uint().
00134 { 00135 data = htonl(data); 00136 mmdb_write(mmdb, &data, sizeof(uint32_t)); 00137 }
void mmdb_write_uint64 | ( | struct mmdb_t * | mmdb, | |
uint64_t | data | |||
) |
Definition at line 157 of file mmdb.c.
References dprintk, and mmdb_write().
00158 { 00159 dprintk("technically, this is not 64 bit safe yet."); 00160 data = htonl(data); 00161 mmdb_write(mmdb, &data, sizeof(uint64_t)); 00162 }