Mercurial > masqmail
diff src/dotlock.c @ 0:08114f7dcc23 0.2.21
this is masqmail-0.2.21 from oliver kurth
author | meillo@marmaro.de |
---|---|
date | Fri, 26 Sep 2008 17:05:23 +0200 |
parents | |
children | 26e34ae9a3e3 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/dotlock.c Fri Sep 26 17:05:23 2008 +0200 @@ -0,0 +1,80 @@ +/* MasqMail + Copyright (C) 2001 Oliver Kurth + + 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 + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include <glib.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <syslog.h> +#include <errno.h> +#include <string.h> +#include <time.h> + +#include "masqmail.h" +#include "dotlock.h" + +gboolean dot_lock(gchar *lock_name, gchar *hitch_name) +{ + gboolean ok = FALSE; + int fd; + + fd = open(hitch_name, O_WRONLY | O_CREAT | O_EXCL, 0); + if(fd != -1){ + struct stat stat_buf; + + close(fd); + link(hitch_name, lock_name); + if(stat(hitch_name, &stat_buf) == 0){ + if(stat_buf.st_nlink == 2){ + unlink(hitch_name); + ok = TRUE; + } + else{ + if(stat(lock_name, &stat_buf) == 0){ + if((time(NULL) - stat_buf.st_mtime) > MAX_LOCKAGE){ + /* remove lock if uncredibly old */ + unlink(lock_name); + + link(hitch_name, lock_name); + if(stat(hitch_name, &stat_buf) == 0){ + if(stat_buf.st_nlink == 2){ + unlink(hitch_name); + ok = TRUE; + } + } + } + } + } + } + if(!ok){ + unlink(hitch_name); + } + }else + logwrite(LOG_WARNING, "could not create lock file %s: %s\n", + lock_name, strerror(errno)); + + return ok; +} + +gboolean dot_unlock(gchar *lock_name) +{ + unlink(lock_name); + + return TRUE; +}