diff options
author | nima <nima@abc39116-655e-4be6-ad55-d661dc543056> | 2008-10-29 07:05:58 +0000 |
---|---|---|
committer | nima <nima@abc39116-655e-4be6-ad55-d661dc543056> | 2008-10-29 07:05:58 +0000 |
commit | ad98794d4d92d173462c53714e3d9f2a0726ff68 (patch) | |
tree | 3d097b2d662409eff2bb099b064276b73f7aa8ad /util.c | |
parent | a4a07b0955dfe6d77e046db346b69e48c7d29066 (diff) | |
download | python-dmidecode-ad98794d4d92d173462c53714e3d9f2a0726ff68.tar.gz python-dmidecode-ad98794d4d92d173462c53714e3d9f2a0726ff68.tar.xz python-dmidecode-ad98794d4d92d173462c53714e3d9f2a0726ff68.zip |
Upstream.
git-svn-id: svn://svn.autonomy.net.au/python-dmidecode@78 abc39116-655e-4be6-ad55-d661dc543056
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 114 |
1 files changed, 77 insertions, 37 deletions
@@ -2,7 +2,7 @@ * Common "util" functions * This file is part of the dmidecode project. * - * (C) 2002-2005 Jean Delvare <khali@linux-fr> + * Copyright (C) 2002-2008 Jean Delvare <khali@linux-fr> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ * * For the avoidance of doubt the "preferred form" of this code is one which * is in an open unpatent encumbered format. Where cryptographic key signing - * forms part of the process of creating an executable the information + * forms part of the process of creating an executable the information * including keys needed to generate an equivalently functional executable * are deemed to be part of the source code. */ @@ -50,15 +50,15 @@ #ifndef USE_MMAP static int myread(int fd, u8 *buf, size_t count, const char *prefix) { - ssize_t r=1; - size_t r2=0; - - while(r2!=count && r!=0) + ssize_t r = 1; + size_t r2 = 0; + + while (r2 != count && r != 0) { - r=read(fd, buf+r2, count-r2); - if(r==-1) + r = read(fd, buf + r2, count - r2); + if (r == -1) { - if(errno!=EINTR) + if (errno != EINTR) { close(fd); perror(prefix); @@ -66,28 +66,28 @@ static int myread(int fd, u8 *buf, size_t count, const char *prefix) } } else - r2+=r; + r2 += r; } - - if(r2!=count) + + if (r2 != count) { close(fd); fprintf(stderr, "%s: Unexpected end of file\n", prefix); return -1; } - + return 0; } #endif int checksum(const u8 *buf, size_t len) { - u8 sum=0; + u8 sum = 0; size_t a; - - for(a=0; a<len; a++) - sum+=buf[a]; - return (sum==0); + + for (a = 0; a < len; a++) + sum += buf[a]; + return (sum == 0); } /* @@ -102,64 +102,104 @@ void *mem_chunk(size_t base, size_t len, const char *devmem) size_t mmoffset; void *mmp; #endif - - if((fd=open(devmem, O_RDONLY))==-1) + + if ((fd = open(devmem, O_RDONLY)) == -1) { perror(devmem); return NULL; } - - if((p=malloc(len))==NULL) + + if ((p = malloc(len)) == NULL) { perror("malloc"); return NULL; } - + #ifdef USE_MMAP #ifdef _SC_PAGESIZE - mmoffset=base%sysconf(_SC_PAGESIZE); + mmoffset = base % sysconf(_SC_PAGESIZE); #else - mmoffset=base%getpagesize(); + mmoffset = base % getpagesize(); #endif /* _SC_PAGESIZE */ /* * Please note that we don't use mmap() for performance reasons here, * but to workaround problems many people encountered when trying * to read from /dev/mem using regular read() calls. */ - mmp=mmap(0, mmoffset+len, PROT_READ, MAP_SHARED, fd, base-mmoffset); - if(mmp==MAP_FAILED) + mmp = mmap(0, mmoffset + len, PROT_READ, MAP_SHARED, fd, base - mmoffset); + if (mmp == MAP_FAILED) { fprintf(stderr, "%s: ", devmem); perror("mmap"); free(p); return NULL; } - - memcpy(p, (u8 *)mmp+mmoffset, len); - - if(munmap(mmp, mmoffset+len)==-1) + + memcpy(p, (u8 *)mmp + mmoffset, len); + + if (munmap(mmp, mmoffset + len) == -1) { fprintf(stderr, "%s: ", devmem); perror("munmap"); } #else /* USE_MMAP */ - if(lseek(fd, base, SEEK_SET)==-1) + if (lseek(fd, base, SEEK_SET) == -1) { fprintf(stderr, "%s: ", devmem); perror("lseek"); free(p); return NULL; } - - if(myread(fd, p, len, devmem)==-1) + + if (myread(fd, p, len, devmem) == -1) { free(p); return NULL; } #endif /* USE_MMAP */ - - if(close(fd)==-1) + + if (close(fd) == -1) perror(devmem); - + return p; } + +int write_dump(size_t base, size_t len, const void *data, const char *dumpfile, int add) +{ + FILE *f; + + f = fopen(dumpfile, add ? "r+b" : "wb"); + if (!f) + { + fprintf(stderr, "%s: ", dumpfile); + perror("fopen"); + return -1; + } + + if (fseek(f, base, SEEK_SET) != 0) + { + fprintf(stderr, "%s: ", dumpfile); + perror("fseek"); + goto err_close; + } + + if (fwrite(data, len, 1, f) != 1) + { + fprintf(stderr, "%s: ", dumpfile); + perror("fwrite"); + goto err_close; + } + + if (fclose(f)) + { + fprintf(stderr, "%s: ", dumpfile); + perror("fclose"); + return -1; + } + + return 0; + +err_close: + fclose(f); + return -1; +} |