diff options
Diffstat (limited to 'src/qmail-qmaint.c')
-rw-r--r-- | src/qmail-qmaint.c | 700 |
1 files changed, 415 insertions, 285 deletions
diff --git a/src/qmail-qmaint.c b/src/qmail-qmaint.c index e83ab6f..70605c8 100644 --- a/src/qmail-qmaint.c +++ b/src/qmail-qmaint.c @@ -1,38 +1,40 @@ /* Based on an implementation of queue-fix 1.2 by Eric Huss */ -#include <unistd.h> -#include <sys/stat.h> -#include <pwd.h> #include <grp.h> -#include "stralloc.h" +#include <pwd.h> +#include <sys/stat.h> +#include <unistd.h> + +#include "buffer.h" #include "direntry.h" -#include "fmt.h" -#include "fmtqfn.h" #include "error.h" -#include "buffer.h" +#include "exit.h" +#include "fifo.h" +#include "fmt.h" #include "getln.h" -#include "str.h" +#include "logmsg.h" #include "open.h" -#include "fifo.h" #include "scan.h" -#include "readsubdir.h" -#include "logmsg.h" -#include "exit.h" +#include "str.h" +#include "stralloc.h" + #include "auto_qmail.h" #include "auto_split.h" #include "auto_uids.h" +#include "fmtqfn.h" +#include "readsubdir.h" #define WHO "qmail-qmaint" -stralloc queue_dir = {0}; /*the root queue dir with trailing slash*/ -stralloc check_dir = {0}; /*the current directory being checked*/ -stralloc temp_dirname = {0}; /*temporary used for checking directories */ +stralloc queue_dir = {0}; /*the root queue dir with trailing slash*/ +stralloc check_dir = {0}; /*the current directory being checked*/ +stralloc temp_dirname = {0}; /*temporary used for checking directories */ stralloc temp_filename = {0}; /*temporary used for checking individuals*/ -stralloc old_name = {0}; /*used in rename*/ -stralloc new_name = {0}; /*used in rename*/ -stralloc mess_dir = {0}; /*used for renaming in mess dir*/ -stralloc query = {0}; /*used in interactive query function*/ +stralloc old_name = {0}; /*used in rename*/ +stralloc new_name = {0}; /*used in rename*/ +stralloc mess_dir = {0}; /*used for renaming in mess dir*/ +stralloc query = {0}; /*used in interactive query function*/ char strnum[FMT_ULONG]; int flag_interactive = 0; @@ -50,32 +52,41 @@ int split_num; void die_make(char *name) { - logmsg(WHO,111,ERROR,B("Failed to make: ",name)); + logmsg(WHO, 111, ERROR, B("Failed to make: ", name)); } void die_user(char *user) { - logmsg(WHO,111,ERROR,B("Failed to determine uid of: ",user)); + logmsg(WHO, 111, ERROR, B("Failed to determine uid of: ", user)); } void die_group(char *group) { - logmsg(WHO,111,ERROR,B("Failed to determine gid of: ",group)); + logmsg(WHO, 111, ERROR, B("Failed to determine gid of: ", group)); } void die_check() { - logmsg(WHO,111,ERROR,"Failed while checking directory structure. \nEnsure the given queue exists and you have permission to access it."); + logmsg( + WHO, + 111, + ERROR, + "Failed while checking directory structure. \nEnsure the given queue exists and you have " + "permission to access it."); } void die_recon() { - logmsg(WHO,110,ERROR,"Failed to reconstruct queue. \nEnsure the queue exists and you have permission to modify it."); + logmsg( + WHO, + 110, + ERROR, + "Failed to reconstruct queue. \nEnsure the queue exists and you have permission to modify it."); } void die_nomem() { - logmsg(WHO,110,ERROR,"Out of memory."); + logmsg(WHO, 110, ERROR, "Out of memory."); } /*returns 1==yes, 0==no*/ @@ -84,7 +95,7 @@ int confirm() { int match; - if (getln(buffer_0,&query,&match,'\n')) return 0; + if (getln(buffer_0, &query, &match, '\n')) return 0; if (!match) return 0; if (query.s[0] == 'y' || query.s[0] == 'Y' || query.s[0] == '\n') return 1; return 0; @@ -92,16 +103,19 @@ int confirm() /*gid may be -1 on files for "unknown*/ -#define DIRS logmsg(WHO,0,WARN,"It looks like some directories don't exist, should I create them? (Y/n)") -#define FILES logmsg(WHO,0,WARN,"It looks like some files don't exist, should I create them? (Y/n)") +#define DIRS \ + logmsg(WHO, 0, WARN, "It looks like some directories don't exist, should I create them? (Y/n)") +#define FILES logmsg(WHO, 0, WARN, "It looks like some files don't exist, should I create them? (Y/n)") -#define PERMS logmsg(WHO,0,WARN,B("It looks like permissions are wrong for ",name," should I fix them? (Y/n)")) -#define CPERMS logmsg(WHO,0,WARN,B("Changing permissions: ",name," => ",pnum)) +#define PERMS \ + logmsg(WHO, 0, WARN, B("It looks like permissions are wrong for ", name, " should I fix them? (Y/n)")) +#define CPERMS logmsg(WHO, 0, WARN, B("Changing permissions: ", name, " => ", pnum)) -#define OWNER logmsg(WHO,0,WARN,B("It looks like ownerships are wrong for ",name," should I fix them? (Y/n)")) -#define COWNER logmsg(WHO,0,WARN,B("Changing ownership: ",name," => ",unum,"/",gnum)) +#define OWNER \ + logmsg(WHO, 0, WARN, B("It looks like ownerships are wrong for ", name, " should I fix them? (Y/n)")) +#define COWNER logmsg(WHO, 0, WARN, B("Changing ownership: ", name, " => ", unum, "/", gnum)) -int check_item(char *name,int uid,int gid,int perm,char type,int size) +int check_item(char *name, int uid, int gid, int perm, char type, int size) { struct stat st; int fd; @@ -110,131 +124,189 @@ int check_item(char *name,int uid,int gid,int perm,char type,int size) char gnum[12]; char pnum[12]; - /*check for existence and proper credentials*/ + /*check for existence and proper credentials*/ - strnum[fmt_ulong(unum,uid)] = 0; - strnum[fmt_ulong(gnum,gid)] = 0; - strnum[fmt_ulong(pnum,perm)] = 0; + strnum[fmt_ulong(unum, uid)] = 0; + strnum[fmt_ulong(gnum, gid)] = 0; + strnum[fmt_ulong(pnum, perm)] = 0; switch (type) { - case 'd': /*directory*/ - if (stat(name,&st)) { - if (errno != ENOENT) return -1; - if (!flag_dircreate && flag_interactive) { - DIRS; if (!confirm()) return -1; - flag_dircreate = 1; - } - /*create it*/ - logmsg(WHO,0,INFO,B("Creating directory: ",name)); - if (mkdir(name,perm)) die_make(name); - CPERMS; if (chmod(name,perm)) die_make(name); - COWNER; if (chown(name,uid,gid)) die_make(name); - return 0; - } - /*check the values*/ - if (st.st_uid != uid || st.st_gid != gid) { - if (!flag_permfix && flag_interactive) { OWNER; if (!confirm()) return -1; flag_permfix = 1; } - COWNER; if (chown(name,uid,gid)) die_make(name); - } - if ((st.st_mode & 07777) != perm) { - if (!flag_permfix && flag_interactive) { PERMS; if (!confirm()) return -1; flag_permfix = 1; } - CPERMS; if (chmod(name,perm)) die_make(name); - } - return 0; - case 'f': /*regular file*/ - if (stat(name,&st)) return -1; - /*check the values*/ - if (st.st_uid != uid || (st.st_gid != gid && gid != -1)) { - if (!flag_permfix && flag_interactive) { OWNER; if (!confirm()) return -1; flag_permfix = 1; } - COWNER; if (chown(name,uid,gid)) die_make(name); - } - if ((st.st_mode & 07777) != perm) { - if (!flag_permfix && flag_interactive) { PERMS; if (!confirm()) return -1; flag_permfix = 1; } - CPERMS; if (chmod(name,perm)) die_make(name); - } - return 0; - case 'z': /*regular file with a size*/ - if (stat(name,&st)) { - if (errno != ENOENT) return -1; - if (!flag_filecreate && flag_interactive) { - FILES; if (!confirm()) return -1; - flag_filecreate = 1; - } - /*create it*/ - - strnum[fmt_ulong(num,size)] = 0; - logmsg(WHO,0,INFO,B("Creating: ",name," with size ",num)); - fd = open_trunc(name); - if (fd == -1) die_make(name); - while (size--) { if (write(fd,"",1)!=1) die_make(name); } - close(fd); - CPERMS; if (chmod(name,perm)) die_make(name); - COWNER; if (chown(name,uid,gid)) die_make(name); - return 0; - } - /*check the values*/ - if (st.st_uid != uid || (st.st_gid != gid && gid != -1)) { - if (!flag_permfix && flag_interactive) { OWNER; if (!confirm()) return -1; flag_permfix = 1; } - COWNER; if (chown(name,uid,gid)) die_make(name); - } - if ((st.st_mode & 07777) != perm) { - if (!flag_permfix && flag_interactive) { PERMS; if (!confirm()) return -1; flag_permfix = 1; } - CPERMS; if (chmod(name,perm)) die_make(name); - } - if (st.st_size != size) { - logmsg(WHO,0,WARN,B("File ",name," has not the right size. I will not fix it, please investigate.")); - } - return 0; + case 'd': /*directory*/ + if (stat(name, &st)) { + if (errno != ENOENT) return -1; + if (!flag_dircreate && flag_interactive) { + DIRS; + if (!confirm()) return -1; + flag_dircreate = 1; + } + /*create it*/ + logmsg(WHO, 0, INFO, B("Creating directory: ", name)); + if (mkdir(name, perm)) die_make(name); + CPERMS; + if (chmod(name, perm)) die_make(name); + COWNER; + if (chown(name, uid, gid)) die_make(name); + return 0; + } + /*check the values*/ + if (st.st_uid != uid || st.st_gid != gid) { + if (!flag_permfix && flag_interactive) { + OWNER; + if (!confirm()) return -1; + flag_permfix = 1; + } + COWNER; + if (chown(name, uid, gid)) die_make(name); + } + if ((st.st_mode & 07777) != perm) { + if (!flag_permfix && flag_interactive) { + PERMS; + if (!confirm()) return -1; + flag_permfix = 1; + } + CPERMS; + if (chmod(name, perm)) die_make(name); + } + return 0; + case 'f': /*regular file*/ + if (stat(name, &st)) return -1; + /*check the values*/ + if (st.st_uid != uid || (st.st_gid != gid && gid != -1)) { + if (!flag_permfix && flag_interactive) { + OWNER; + if (!confirm()) return -1; + flag_permfix = 1; + } + COWNER; + if (chown(name, uid, gid)) die_make(name); + } + if ((st.st_mode & 07777) != perm) { + if (!flag_permfix && flag_interactive) { + PERMS; + if (!confirm()) return -1; + flag_permfix = 1; + } + CPERMS; + if (chmod(name, perm)) die_make(name); + } + return 0; + case 'z': /*regular file with a size*/ + if (stat(name, &st)) { + if (errno != ENOENT) return -1; + if (!flag_filecreate && flag_interactive) { + FILES; + if (!confirm()) return -1; + flag_filecreate = 1; + } + /*create it*/ + + strnum[fmt_ulong(num, size)] = 0; + logmsg(WHO, 0, INFO, B("Creating: ", name, " with size ", num)); + fd = open_trunc(name); + if (fd == -1) die_make(name); + while (size--) { + if (write(fd, "", 1) != 1) die_make(name); + } + close(fd); + CPERMS; + if (chmod(name, perm)) die_make(name); + COWNER; + if (chown(name, uid, gid)) die_make(name); + return 0; + } + /*check the values*/ + if (st.st_uid != uid || (st.st_gid != gid && gid != -1)) { + if (!flag_permfix && flag_interactive) { + OWNER; + if (!confirm()) return -1; + flag_permfix = 1; + } + COWNER; + if (chown(name, uid, gid)) die_make(name); + } + if ((st.st_mode & 07777) != perm) { + if (!flag_permfix && flag_interactive) { + PERMS; + if (!confirm()) return -1; + flag_permfix = 1; + } + CPERMS; + if (chmod(name, perm)) die_make(name); + } + if (st.st_size != size) { + logmsg( + WHO, + 0, + WARN, + B("File ", name, " has not the right size. I will not fix it, please investigate.")); + } + return 0; case 'p': /*a named pipe*/ - if (stat(name,&st)) { - if (errno != ENOENT) return -1; - if (!flag_filecreate && flag_interactive) { - FILES; if (!confirm()) return -1; - flag_filecreate = 1; - } - /*create it*/ - logmsg(WHO,INFO,0,B("Creating fifo: ",name)); - if (fifo_make(name,perm)) die_make(name); - CPERMS; if (chmod(name,perm)) die_make(name); - COWNER; if (chown(name,uid,gid)) die_make(name); - return 0; - } - /*check the values*/ - if (st.st_uid != uid || (st.st_gid != gid && gid != -1)) { - if (!flag_permfix && flag_interactive) { OWNER; if (!confirm()) return -1; flag_permfix = 1; } - COWNER; if (chown(name,uid,gid)) die_make(name); - } - if ((st.st_mode & 07777) != perm) { - if (!flag_permfix && flag_interactive) { PERMS; if (!confirm()) return -1; flag_permfix = 1; } - CPERMS; if (chmod(name,perm)) die_make(name); - } - return 0; - } + if (stat(name, &st)) { + if (errno != ENOENT) return -1; + if (!flag_filecreate && flag_interactive) { + FILES; + if (!confirm()) return -1; + flag_filecreate = 1; + } + /*create it*/ + logmsg(WHO, INFO, 0, B("Creating fifo: ", name)); + if (fifo_make(name, perm)) die_make(name); + CPERMS; + if (chmod(name, perm)) die_make(name); + COWNER; + if (chown(name, uid, gid)) die_make(name); + return 0; + } + /*check the values*/ + if (st.st_uid != uid || (st.st_gid != gid && gid != -1)) { + if (!flag_permfix && flag_interactive) { + OWNER; + if (!confirm()) return -1; + flag_permfix = 1; + } + COWNER; + if (chown(name, uid, gid)) die_make(name); + } + if ((st.st_mode & 07777) != perm) { + if (!flag_permfix && flag_interactive) { + PERMS; + if (!confirm()) return -1; + flag_permfix = 1; + } + CPERMS; + if (chmod(name, perm)) die_make(name); + } + return 0; + } return 0; } -int check_files(char * directory,int uid,int gid,int perm) +int check_files(char *directory, int uid, int gid, int perm) { DIR *dir; direntry *d; dir = opendir(directory); - + if (!dir) return -1; while ((d = readdir(dir))) { if (d->d_name[0] == '.') continue; - if (!stralloc_copys(&temp_filename,directory)) die_nomem(); - if (!stralloc_append(&temp_filename,"/")) die_nomem(); - if (!stralloc_cats(&temp_filename,d->d_name)) die_nomem(); + if (!stralloc_copys(&temp_filename, directory)) die_nomem(); + if (!stralloc_append(&temp_filename, "/")) die_nomem(); + if (!stralloc_cats(&temp_filename, d->d_name)) die_nomem(); if (!stralloc_0(&temp_filename)) die_nomem(); - if (check_item(temp_filename.s,uid,gid,perm,'f',0)) { closedir(dir); return -1; } + if (check_item(temp_filename.s, uid, gid, perm, 'f', 0)) { + closedir(dir); + return -1; + } } closedir(dir); return 0; } -void warn_files(char * directory) +void warn_files(char *directory) { DIR *dir; direntry *d; @@ -251,71 +323,80 @@ void warn_files(char * directory) closedir(dir); - if (found) - logmsg(WHO,0,WARN,B("Found files in ",directory," that shouldn't be there. I will not remove them. You should consider checking it out.")); + if (found) + logmsg( + WHO, + 0, + WARN, + B("Found files in ", + directory, + " that shouldn't be there. I will not remove them. You should consider checking it out.")); } -int check_splits(char * directory,int dir_uid,int dir_gid,int dir_perm,int file_gid,int file_perm) +int check_splits(char *directory, int dir_uid, int dir_gid, int dir_perm, int file_gid, int file_perm) { DIR *dir; direntry *d; int i; - for (i = 0; i < split_num ; i++) { - strnum[fmt_ulong(strnum,i)] = 0; - if (!stralloc_copys(&temp_dirname,directory)) die_nomem(); - if (!stralloc_append(&temp_dirname,"/")) die_nomem(); - if (!stralloc_cats(&temp_dirname,strnum)) die_nomem(); + for (i = 0; i < split_num; i++) { + strnum[fmt_ulong(strnum, i)] = 0; + if (!stralloc_copys(&temp_dirname, directory)) die_nomem(); + if (!stralloc_append(&temp_dirname, "/")) die_nomem(); + if (!stralloc_cats(&temp_dirname, strnum)) die_nomem(); if (!stralloc_0(&temp_dirname)) die_nomem(); /*check the split dir*/ - if (check_item(temp_dirname.s,dir_uid,dir_gid,dir_perm,'d',0)) return -1; + if (check_item(temp_dirname.s, dir_uid, dir_gid, dir_perm, 'd', 0)) return -1; /*check its contents*/ dir = opendir(temp_dirname.s); if (!dir) return -1; while ((d = readdir(dir))) { if (d->d_name[0] == '.') continue; - if (!stralloc_copys(&temp_filename,temp_dirname.s)) die_nomem(); - if (!stralloc_append(&temp_filename,"/")) die_nomem(); - if (!stralloc_cats(&temp_filename,d->d_name)) die_nomem(); + if (!stralloc_copys(&temp_filename, temp_dirname.s)) die_nomem(); + if (!stralloc_append(&temp_filename, "/")) die_nomem(); + if (!stralloc_cats(&temp_filename, d->d_name)) die_nomem(); if (!stralloc_0(&temp_filename)) die_nomem(); - if (check_item(temp_filename.s,dir_uid,file_gid,file_perm,'f',0)) { closedir(dir); return -1; } + if (check_item(temp_filename.s, dir_uid, file_gid, file_perm, 'f', 0)) { + closedir(dir); + return -1; + } } closedir(dir); - } + } return 0; } int rename_mess(char *dir, char *part, char *new_part, char *old_filename, char *new_filename) { - + if (flag_interactive && !flag_namefix) { - logmsg(WHO,0,INFO,"It looks like some files need to be renamed, should I rename them? (Y/n)\n"); + logmsg(WHO, 0, INFO, "It looks like some files need to be renamed, should I rename them? (Y/n)\n"); if (!confirm()) return -1; flag_namefix = 1; } /*prepare the old filename*/ - if (!stralloc_copy(&old_name,&queue_dir)) die_nomem(); - if (!stralloc_cats(&old_name,dir)) die_nomem(); - if (!stralloc_cats(&old_name,part)) die_nomem(); - if (!stralloc_append(&old_name,"/")) die_nomem(); - if (!stralloc_cats(&old_name,old_filename)) die_nomem(); + if (!stralloc_copy(&old_name, &queue_dir)) die_nomem(); + if (!stralloc_cats(&old_name, dir)) die_nomem(); + if (!stralloc_cats(&old_name, part)) die_nomem(); + if (!stralloc_append(&old_name, "/")) die_nomem(); + if (!stralloc_cats(&old_name, old_filename)) die_nomem(); if (!stralloc_0(&old_name)) die_nomem(); /*prepare the new filename*/ - if (!stralloc_copy(&new_name,&queue_dir)) die_nomem(); - if (!stralloc_cats(&new_name,dir)) die_nomem(); - if (!stralloc_cats(&new_name,new_part)) die_nomem(); - if (!stralloc_append(&new_name,"/")) die_nomem(); - if (!stralloc_cats(&new_name,new_filename)) die_nomem(); + if (!stralloc_copy(&new_name, &queue_dir)) die_nomem(); + if (!stralloc_cats(&new_name, dir)) die_nomem(); + if (!stralloc_cats(&new_name, new_part)) die_nomem(); + if (!stralloc_append(&new_name, "/")) die_nomem(); + if (!stralloc_cats(&new_name, new_filename)) die_nomem(); if (!stralloc_0(&new_name)) die_nomem(); - logmsg(WHO,0,INFO,B("Renaming ",old_name.s," to ",new_name.s)); - if (rename(old_name.s,new_name.s)) { - if (errno != ENOENT) return -1; + logmsg(WHO, 0, INFO, B("Renaming ", old_name.s, " to ", new_name.s)); + if (rename(old_name.s, new_name.s)) { + if (errno != ENOENT) return -1; } return 0; @@ -332,11 +413,11 @@ int fix_part(char *part) int part_num; int correct_part_num; - scan_uint(part,&part_num); + scan_uint(part, &part_num); - if (!stralloc_copy(&mess_dir,&queue_dir)) die_nomem(); - if (!stralloc_cats(&mess_dir,"mess/")) die_nomem(); - if (!stralloc_cats(&mess_dir,part)) die_nomem(); + if (!stralloc_copy(&mess_dir, &queue_dir)) die_nomem(); + if (!stralloc_cats(&mess_dir, "mess/")) die_nomem(); + if (!stralloc_cats(&mess_dir, part)) die_nomem(); if (!stralloc_0(&mess_dir)) die_nomem(); dir = opendir(mess_dir.s); @@ -345,28 +426,52 @@ int fix_part(char *part) while ((d = readdir(dir))) { if (d->d_name[0] == '.') continue; /*check from mess*/ - if (!stralloc_copys(&temp_filename,mess_dir.s)) die_nomem(); - if (!stralloc_append(&temp_filename,"/")) die_nomem(); - if (!stralloc_cats(&temp_filename,d->d_name)) die_nomem(); + if (!stralloc_copys(&temp_filename, mess_dir.s)) die_nomem(); + if (!stralloc_append(&temp_filename, "/")) die_nomem(); + if (!stralloc_cats(&temp_filename, d->d_name)) die_nomem(); if (!stralloc_0(&temp_filename)) die_nomem(); - if (stat(temp_filename.s,&st)) { closedir(dir); return -1; } + if (stat(temp_filename.s, &st)) { + closedir(dir); + return -1; + } /*check that filename == inode number*/ /*check that inode%auto_split == part_num*/ - scan_uint(d->d_name,&old_inode); + scan_uint(d->d_name, &old_inode); correct_part_num = st.st_ino % split_num; if (st.st_ino != old_inode || part_num != correct_part_num) { /*rename*/ - inode[fmt_ulong(inode,st.st_ino)] = 0; - new_part[fmt_ulong(new_part,correct_part_num)] = 0; - if (rename_mess("mess/",part,new_part,d->d_name,inode)) { closedir(dir); return -1; } - if (rename_mess("info/",part,new_part,d->d_name,inode)) { closedir(dir); return -1; } - if (rename_mess("local/",part,new_part,d->d_name,inode)) { closedir(dir); return -1; } - if (rename_mess("remote/",part,new_part,d->d_name,inode)) { closedir(dir); return -1; } - if (rename_mess("todo/",part,new_part,d->d_name,inode)) { closedir(dir); return -1; } - if (rename_mess("intd/",part,new_part,d->d_name,inode)) { closedir(dir); return -1; } - - if (rename_mess("bounce","","",d->d_name,inode)) { closedir(dir); return -1; } + inode[fmt_ulong(inode, st.st_ino)] = 0; + new_part[fmt_ulong(new_part, correct_part_num)] = 0; + if (rename_mess("mess/", part, new_part, d->d_name, inode)) { + closedir(dir); + return -1; + } + if (rename_mess("info/", part, new_part, d->d_name, inode)) { + closedir(dir); + return -1; + } + if (rename_mess("local/", part, new_part, d->d_name, inode)) { + closedir(dir); + return -1; + } + if (rename_mess("remote/", part, new_part, d->d_name, inode)) { + closedir(dir); + return -1; + } + if (rename_mess("todo/", part, new_part, d->d_name, inode)) { + closedir(dir); + return -1; + } + if (rename_mess("intd/", part, new_part, d->d_name, inode)) { + closedir(dir); + return -1; + } + + if (rename_mess("bounce", "", "", d->d_name, inode)) { + closedir(dir); + return -1; + } } } @@ -378,102 +483,102 @@ int fix_names() { int i; - if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem(); - if (!stralloc_cats(&check_dir,"mess")) die_nomem(); + if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem(); + if (!stralloc_cats(&check_dir, "mess")) die_nomem(); if (!stralloc_0(&check_dir)) die_nomem(); for (i = 0; i < split_num; i++) { - strnum[fmt_ulong(strnum,i)] = 0; + strnum[fmt_ulong(strnum, i)] = 0; if (fix_part(strnum)) return -1; } - return 0; + return 0; } int check_dirs() { /*check root existence*/ - if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem(); + if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem(); if (!stralloc_0(&check_dir)) die_nomem(); - if (check_item(check_dir.s,qmailq_uid,qmail_gid,0750,'d',0)) return -1; + if (check_item(check_dir.s, qmailq_uid, qmail_gid, 0750, 'd', 0)) return -1; /*check the bigtodo queue */ - if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem(); - if (!stralloc_cats(&check_dir,"info")) die_nomem(); + if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem(); + if (!stralloc_cats(&check_dir, "info")) die_nomem(); if (!stralloc_0(&check_dir)) die_nomem(); - if (check_item(check_dir.s,qmails_uid,qmail_gid,0700,'d',0)) return -1; - if (check_splits(check_dir.s,qmails_uid,qmail_gid,0700,qmail_gid,0600)) return -1; + if (check_item(check_dir.s, qmails_uid, qmail_gid, 0700, 'd', 0)) return -1; + if (check_splits(check_dir.s, qmails_uid, qmail_gid, 0700, qmail_gid, 0600)) return -1; - if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem(); - if (!stralloc_cats(&check_dir,"mess")) die_nomem(); + if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem(); + if (!stralloc_cats(&check_dir, "mess")) die_nomem(); if (!stralloc_0(&check_dir)) die_nomem(); - if (check_item(check_dir.s,qmailq_uid,qmail_gid,0750,'d',0)) return -1; - if (check_splits(check_dir.s,qmailq_uid,qmail_gid,0750,-1,0644)) return -1; + if (check_item(check_dir.s, qmailq_uid, qmail_gid, 0750, 'd', 0)) return -1; + if (check_splits(check_dir.s, qmailq_uid, qmail_gid, 0750, -1, 0644)) return -1; - if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem(); - if (!stralloc_cats(&check_dir,"remote")) die_nomem(); + if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem(); + if (!stralloc_cats(&check_dir, "remote")) die_nomem(); if (!stralloc_0(&check_dir)) die_nomem(); - if (check_item(check_dir.s,qmails_uid,qmail_gid,0700,'d',0)) return -1; - if (check_splits(check_dir.s,qmails_uid,qmail_gid,0700,qmail_gid,0600)) return -1; + if (check_item(check_dir.s, qmails_uid, qmail_gid, 0700, 'd', 0)) return -1; + if (check_splits(check_dir.s, qmails_uid, qmail_gid, 0700, qmail_gid, 0600)) return -1; - if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem(); - if (!stralloc_cats(&check_dir,"local")) die_nomem(); + if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem(); + if (!stralloc_cats(&check_dir, "local")) die_nomem(); if (!stralloc_0(&check_dir)) die_nomem(); - if (check_item(check_dir.s,qmails_uid,qmail_gid,0700,'d',0)) return -1; - if (check_splits(check_dir.s,qmails_uid,qmail_gid,0700,qmail_gid,0600)) return -1; + if (check_item(check_dir.s, qmails_uid, qmail_gid, 0700, 'd', 0)) return -1; + if (check_splits(check_dir.s, qmails_uid, qmail_gid, 0700, qmail_gid, 0600)) return -1; - if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem(); - if (!stralloc_cats(&check_dir,"intd")) die_nomem(); + if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem(); + if (!stralloc_cats(&check_dir, "intd")) die_nomem(); if (!stralloc_0(&check_dir)) die_nomem(); - if (check_item(check_dir.s,qmailq_uid,qmail_gid,0700,'d',0)) return -1; - if (check_splits(check_dir.s,qmailq_uid,qmail_gid,0700,qmail_gid,0600)) return -1; + if (check_item(check_dir.s, qmailq_uid, qmail_gid, 0700, 'd', 0)) return -1; + if (check_splits(check_dir.s, qmailq_uid, qmail_gid, 0700, qmail_gid, 0600)) return -1; - if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem(); - if (!stralloc_cats(&check_dir,"todo")) die_nomem(); + if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem(); + if (!stralloc_cats(&check_dir, "todo")) die_nomem(); if (!stralloc_0(&check_dir)) die_nomem(); - if (check_item(check_dir.s,qmailq_uid,qmail_gid,0750,'d',0)) return -1; - if (check_splits(check_dir.s,qmailq_uid,qmail_gid,0750,-1,0644)) return -1; + if (check_item(check_dir.s, qmailq_uid, qmail_gid, 0750, 'd', 0)) return -1; + if (check_splits(check_dir.s, qmailq_uid, qmail_gid, 0750, -1, 0644)) return -1; - if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem(); - if (!stralloc_cats(&check_dir,"dkim")) die_nomem(); + if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem(); + if (!stralloc_cats(&check_dir, "dkim")) die_nomem(); if (!stralloc_0(&check_dir)) die_nomem(); - if (check_item(check_dir.s,qmailq_uid,qmail_gid,0750,'d',0)) return -1; - if (check_splits(check_dir.s,qmailq_uid,qmail_gid,0750,qmail_gid,0644)) return -1; + if (check_item(check_dir.s, qmailq_uid, qmail_gid, 0750, 'd', 0)) return -1; + if (check_splits(check_dir.s, qmailq_uid, qmail_gid, 0750, qmail_gid, 0644)) return -1; /*check the others*/ - if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem(); - if (!stralloc_cats(&check_dir,"bounce")) die_nomem(); + if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem(); + if (!stralloc_cats(&check_dir, "bounce")) die_nomem(); if (!stralloc_0(&check_dir)) die_nomem(); - if (check_item(check_dir.s,qmails_uid,qmail_gid,0700,'d',0)) return -1; - if (check_files(check_dir.s,qmails_uid,qmail_gid,0600)) return -1; + if (check_item(check_dir.s, qmails_uid, qmail_gid, 0700, 'd', 0)) return -1; + if (check_files(check_dir.s, qmails_uid, qmail_gid, 0600)) return -1; - if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem(); - if (!stralloc_cats(&check_dir,"pid")) die_nomem(); + if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem(); + if (!stralloc_cats(&check_dir, "pid")) die_nomem(); if (!stralloc_0(&check_dir)) die_nomem(); - if (check_item(check_dir.s,qmailq_uid,qmail_gid,0700,'d',0)) return -1; + if (check_item(check_dir.s, qmailq_uid, qmail_gid, 0700, 'd', 0)) return -1; warn_files(check_dir.s); /*lock has special files that must exist*/ - if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem(); - if (!stralloc_cats(&check_dir,"lock")) die_nomem(); + if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem(); + if (!stralloc_cats(&check_dir, "lock")) die_nomem(); if (!stralloc_0(&check_dir)) die_nomem(); - if (check_item(check_dir.s,qmailq_uid,qmail_gid,0750,'d',0)) return -1; + if (check_item(check_dir.s, qmailq_uid, qmail_gid, 0750, 'd', 0)) return -1; - if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem(); - if (!stralloc_cats(&check_dir,"lock/sendmutex")) die_nomem(); + if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem(); + if (!stralloc_cats(&check_dir, "lock/sendmutex")) die_nomem(); if (!stralloc_0(&check_dir)) die_nomem(); - if (check_item(check_dir.s,qmails_uid,qmail_gid,0600,'z',0)) return -1; + if (check_item(check_dir.s, qmails_uid, qmail_gid, 0600, 'z', 0)) return -1; - if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem(); - if (!stralloc_cats(&check_dir,"lock/tcpto")) die_nomem(); + if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem(); + if (!stralloc_cats(&check_dir, "lock/tcpto")) die_nomem(); if (!stralloc_0(&check_dir)) die_nomem(); - if (check_item(check_dir.s,qmailr_uid,qmail_gid,0644,'z',1024)) return -1; + if (check_item(check_dir.s, qmailr_uid, qmail_gid, 0644, 'z', 1024)) return -1; - if (!stralloc_copy(&check_dir,&queue_dir)) die_nomem(); - if (!stralloc_cats(&check_dir,"lock/trigger")) die_nomem(); + if (!stralloc_copy(&check_dir, &queue_dir)) die_nomem(); + if (!stralloc_cats(&check_dir, "lock/trigger")) die_nomem(); if (!stralloc_0(&check_dir)) die_nomem(); - if (check_item(check_dir.s,qmails_uid,qmail_gid,0622,'p',0)) return -1; + if (check_item(check_dir.s, qmails_uid, qmail_gid, 0622, 'p', 0)) return -1; return 0; } @@ -482,31 +587,52 @@ int check_dirs() stralloc fn = {0}; -void fnmake_init() { while (!stralloc_ready(&fn,FMTQFN)) die_nomem(); } -void fnmake_local(unsigned long id) { fn.len = fmtqfn(fn.s,"local/",id,1); } -void fnmake_remote(unsigned long id) { fn.len = fmtqfn(fn.s,"remote/",id,1); } -void fnmake_mess(unsigned long id) { fn.len = fmtqfn(fn.s,"mess/",id,1); } -void fnmake_dkim(unsigned long id) { fn.len = fmtqfn(fn.s,"dkim/",id,1); } -void fnmake_info(unsigned long id) { fn.len = fmtqfn(fn.s,"info/",id,1); } -void fnmake_bounce(unsigned long id) { fn.len = fmtqfn(fn.s,"bounce/",id,0); } +void fnmake_init() +{ + while (!stralloc_ready(&fn, FMTQFN)) die_nomem(); +} +void fnmake_local(unsigned long id) +{ + fn.len = fmtqfn(fn.s, "local/", id, 1); +} +void fnmake_remote(unsigned long id) +{ + fn.len = fmtqfn(fn.s, "remote/", id, 1); +} +void fnmake_mess(unsigned long id) +{ + fn.len = fmtqfn(fn.s, "mess/", id, 1); +} +void fnmake_dkim(unsigned long id) +{ + fn.len = fmtqfn(fn.s, "dkim/", id, 1); +} +void fnmake_info(unsigned long id) +{ + fn.len = fmtqfn(fn.s, "info/", id, 1); +} +void fnmake_bounce(unsigned long id) +{ + fn.len = fmtqfn(fn.s, "bounce/", id, 0); +} void warn_unlink(unsigned long id) { - char foo[FMT_ULONG]; - foo[fmt_ulong(foo,id)] = 0; - logmsg(WHO,99,WARN,B("no such file to unlink #",foo)); + char foo[FMT_ULONG]; + foo[fmt_ulong(foo, id)] = 0; + logmsg(WHO, 99, WARN, B("no such file to unlink #", foo)); } void err_unlink(unsigned long id) { - char foo[FMT_ULONG]; - foo[fmt_ulong(foo,id)] = 0; - logmsg(WHO,100,ERROR,B("trouble with unlinking #",foo)); + char foo[FMT_ULONG]; + foo[fmt_ulong(foo, id)] = 0; + logmsg(WHO, 100, ERROR, B("trouble with unlinking #", foo)); } void err_chdir() { - logmsg(WHO,110,FATAL,"unable to chdir"); + logmsg(WHO, 110, FATAL, "unable to chdir"); } int delete_msg(unsigned long id) @@ -514,38 +640,43 @@ int delete_msg(unsigned long id) struct stat st; int bounce = 1; - if (chdir(auto_qmail) == -1) err_chdir(); - if (chdir("queue") == -1) err_chdir(); + if (chdir(auto_qmail) == -1) err_chdir(); + if (chdir("queue") == -1) err_chdir(); fnmake_init(); fnmake_mess(id); // regular message pre-processed - if (stat(fn.s,&st) == -1) err_unlink(id); - else bounce = 0; - if (!bounce && unlink(fn.s) == -1) + if (stat(fn.s, &st) == -1) + err_unlink(id); + else + bounce = 0; + if (!bounce && unlink(fn.s) == -1) if (errno != ENOENT) err_unlink(id); fnmake_info(id); // not delivered yet - if (!stat(fn.s,&st)) - if (unlink(fn.s) == -1) + if (!stat(fn.s, &st)) + if (unlink(fn.s) == -1) if (errno != ENOENT) err_unlink(id); - + if (bounce) { fnmake_bounce(id); - if (!stat(fn.s,&st)) { warn_unlink(id); return 1; } - if (unlink(fn.s) == -1) - if (errno != ENOENT) err_unlink(id); + if (!stat(fn.s, &st)) { + warn_unlink(id); + return 1; + } + if (unlink(fn.s) == -1) + if (errno != ENOENT) err_unlink(id); } fnmake_remote(id); - if (!stat(fn.s,&st)) - if (unlink(fn.s) == -1) - if (errno != ENOENT) err_unlink(id); - + if (!stat(fn.s, &st)) + if (unlink(fn.s) == -1) + if (errno != ENOENT) err_unlink(id); + fnmake_local(id); - if (!stat(fn.s,&st)) - if (unlink(fn.s) == -1) - if (errno != ENOENT) err_unlink(id); - + if (!stat(fn.s, &st)) + if (unlink(fn.s) == -1) + if (errno != ENOENT) err_unlink(id); + return 0; } @@ -555,20 +686,20 @@ int main(int argc, char **argv) unsigned long id = 0; if (argc > 1) { - if (!str_diff(argv[1],"-i")) { + if (!str_diff(argv[1], "-i")) { flag_interactive = 1; - } else if (!str_diff(argv[1],"-d")) { - if (!argv[2]) logmsg(WHO,111,USAGE,"qmail-qmaint [-i] || [-d messid]"); + } else if (!str_diff(argv[1], "-d")) { + if (!argv[2]) logmsg(WHO, 111, USAGE, "qmail-qmaint [-i] || [-d messid]"); mess = argv[2]; flag_delete = 1; - scan_ulong(mess,&id); + scan_ulong(mess, &id); } } - if (!stralloc_copys(&queue_dir,auto_qmail)) die_nomem(); - if (!stralloc_cats(&queue_dir,"/queue/")) die_nomem(); + if (!stralloc_copys(&queue_dir, auto_qmail)) die_nomem(); + if (!stralloc_cats(&queue_dir, "/queue/")) die_nomem(); - logmsg(WHO,0,INFO,B("Checking s/qmail queue at: ",auto_qmail,"/queue/")); + logmsg(WHO, 0, INFO, B("Checking s/qmail queue at: ", auto_qmail, "/queue/")); /* get constants */ @@ -583,12 +714,11 @@ int main(int argc, char **argv) if (check_dirs()) die_check(); if (flag_delete) { - if (!delete_msg(id)) - logmsg(WHO,0,INFO,B("file ",mess," from queue deleted.")); - } else - if (fix_names()) die_check(); - - logmsg(WHO,0,INFO,"done."); - - _exit (0); + if (!delete_msg(id)) logmsg(WHO, 0, INFO, B("file ", mess, " from queue deleted.")); + } else if (fix_names()) + die_check(); + + logmsg(WHO, 0, INFO, "done."); + + _exit(0); } |