summaryrefslogtreecommitdiff
path: root/src/qmail-qmaint.c
diff options
context:
space:
mode:
authorJannis Hoffmann <jannis@fehcom.de>2024-07-03 15:52:39 +0200
committerJannis Hoffmann <jannis@fehcom.de>2024-07-03 15:52:39 +0200
commita6a7d6ce079cabdaf2fa502b2e2cf15e5428ac6f (patch)
treeb88cc7a8457658d67e0321718556ac807f6bccf3 /src/qmail-qmaint.c
parent00be7622c428f279872f84569f098ce16150f8a8 (diff)
format files
Diffstat (limited to 'src/qmail-qmaint.c')
-rw-r--r--src/qmail-qmaint.c700
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);
}