diff options
Diffstat (limited to 'ldapaddressbook/abookdel.c')
| -rw-r--r-- | ldapaddressbook/abookdel.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/ldapaddressbook/abookdel.c b/ldapaddressbook/abookdel.c new file mode 100644 index 0000000..a5da9d0 --- /dev/null +++ b/ldapaddressbook/abookdel.c @@ -0,0 +1,53 @@ +/* +** Copyright 2006, Double Precision Inc. +** +** See COPYING for distribution information. +*/ + +#include "config.h" +#include "ldapaddressbook.h" + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <unistd.h> + +int ldapabook_del(const char *filename, const char *tempname, + const char *delname) +{ +/* This is cheating, but we won't really have many abooks, come on... */ +struct ldapabook *a=ldapabook_read(filename), *b; + +FILE *fp; + + if (!a) return (0); + + if ((fp=fopen(tempname, "w")) == 0) + { + ldapabook_free(a); + return (-1); + } + + for (b=a; b; b=b->next) + { + if (strcmp(b->name, delname) == 0) continue; + + ldapabook_writerec(b, fp); + } + ldapabook_free(a); + + if (fflush(fp) || fclose(fp)) + { + fclose(fp); + unlink(tempname); + return (-1); + } + + if (rename(tempname, filename)) + { + unlink(tempname); + return (-1); + } + + return (0); +} |
