diff options
Diffstat (limited to 'src/md5util.c')
-rw-r--r-- | src/md5util.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/md5util.c b/src/md5util.c new file mode 100644 index 0000000..41a5a31 --- /dev/null +++ b/src/md5util.c @@ -0,0 +1,85 @@ +/*** + This file is part of pam_dotfile. + + pam_dotfile is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + pam_dotfile is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with pam_dotfile; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA +***/ + +#include <unistd.h> +#include <sys/mman.h> +#include <stdio.h> +#include <stdlib.h> + +#include "md5util.h" +#include "md5.h" + +void fhex(const unsigned char *bin,int len, char *txt) { + const static char hex[] = "0123456789abcdef"; + int i; + + for (i = 0; i < len; i++) { + txt[i*2] = hex[bin[i]>>4]; + txt[i*2+1] = hex[bin[i]&0xF]; + } +} + +#define MMAPSIZE (100*1024*1024) +#define BUFSIZE (1024*1024) + +int fdmd5(int fd, size_t l, char *md) { + void *d; + off_t o = 0; + size_t m; + int r = 0; + md5_state_t s; + + md5_init(&s); + + m = l < MMAPSIZE ? l : MMAPSIZE; + + while (l > 0 && (d = mmap(NULL, m, PROT_READ, MAP_SHARED, fd, o))) { + md5_append(&s, d, m); + munmap(d, m); + + o += m; + l -= m; + m = l < MMAPSIZE ? l : MMAPSIZE; + + } + + if (l > 0) { + void *p; + fprintf(stderr, "mmap() failed\n"); + + if (!(p = malloc(BUFSIZE))) + r = -1; + else { + + for (;;) { + ssize_t r; + + if ((r = read(fd, p, BUFSIZE)) <= 0) + break; + + md5_append(&s, p, r); + } + + free(p); + } + } + + md5_finish(&s, md); + return r; +} |