src/mmdb.c File Reference

#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_tmmdb_open_read (char *filename)
mmdb_tmmdb_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)


Function Documentation

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  ) 

Definition at line 164 of file mmdb.c.

References dprintk, and mmdb_t::ppos.

00165 {
00166     dprintk("technically, this is not 64 bit safe yet.");
00167         uint64_t data = *((uint64_t *) (mmdb->ppos));
00168         mmdb->ppos += sizeof(uint64_t);
00169         return ntohl(data);
00170 }

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 }


Generated on Mon May 28 04:25:46 2007 for BattletechMUX by  doxygen 1.4.7