Back to index

courier  0.68.2
Defines | Functions
maildirgetnew.c File Reference
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#include "maildirmisc.h"

Go to the source code of this file.

Defines

#define dirent   direct
#define NAMLEN(dirent)   (dirent)->d_namlen

Functions

static void do_maildir_getnew (const char *, const char *, void(*)(const char *, void *), void *)
void maildir_getnew (const char *maildir, const char *folder, void(*callback_func)(const char *, void *), void *callback_arg)

Define Documentation

#define dirent   direct

Definition at line 15 of file maildirgetnew.c.

#define NAMLEN (   dirent)    (dirent)->d_namlen

Definition at line 16 of file maildirgetnew.c.


Function Documentation

static void do_maildir_getnew ( const char *  newd,
const char *  curd,
void(*)(const char *, void *)  callback_func,
void *  callback_arg 
) [static]

Definition at line 69 of file maildirgetnew.c.

{
       DIR    *dirp;
       struct dirent *de;
       int keepgoing;
       int n;
       char *new_buf[20];
       char *cur_buf[20];

       do
       {
              keepgoing=0;
              n=0;

              dirp=opendir(newd);
              while (dirp && (de=readdir(dirp)) != 0)
              {
                     char   *np, *cp;

                     if (de->d_name[0] == '.')   continue;

                     if ((np=malloc(strlen(newd)+strlen(de->d_name)+2))
                         != 0)
                     {
                            if ((cp=malloc(strlen(curd)+strlen(de->d_name)
                                          + sizeof("/" MDIRSEP "2,")))
                                != 0)
                            {
                                   char *a;

                                   strcat(strcat(strcpy(np, newd), "/"),
                                          de->d_name);
                                   strcat(strcat(strcpy(cp, curd), "/"),
                                          de->d_name);
                                   a=strchr(cp+strlen(curd), MDIRSEP[0]);
                                   if (a && strncmp(a, MDIRSEP "2,", 3))
                                   {
                                          *a=0;
                                          a=0;
                                   }
                                   if (!a)       strcat(cp, MDIRSEP "2,");
                                   new_buf[n]=np;
                                   cur_buf[n]=cp;

                                   if (++n >= sizeof(cur_buf)/
                                       sizeof(cur_buf[0]))
                                   {
                                          keepgoing=1;
                                          break;
                                   }
                            }
                            else
                                   free(np);
                     }
              }
              if (dirp)     closedir(dirp);

              while (n)
              {
                     char *np, *cp;

                     --n;

                     np=new_buf[n];
                     cp=cur_buf[n];

                     if (rename(np, cp))
                     {
                            fprintf(stderr,
                                   "ERR: rename(%s,%s) failed:"
                                   " %s\n", np, cp, strerror(errno));
                            keepgoing=0;
                            /* otherwise we could have infinite loop */
                     }

                     if (callback_func)
                            (*callback_func)(strrchr(cp, '/')+1,
                                           callback_arg);
                     free(np);
                     free(cp);
              }
       } while (keepgoing);
}

Here is the caller graph for this function:

void maildir_getnew ( const char *  maildir,
const char *  folder,
void(*)(const char *, void *)  callback_func,
void *  callback_arg 
)

Definition at line 45 of file maildirgetnew.c.

{
char   *dir=maildir_folderdir(maildir, folder);
char   *newd, *curd;

       if (!dir)     return;

       newd=malloc(strlen(dir)+sizeof("/new"));
       curd=malloc(strlen(dir)+sizeof("/cur"));

       if (newd && curd)
       {
              strcat(strcpy(newd, dir), "/new");
              strcat(strcpy(curd, dir), "/cur");
              do_maildir_getnew(newd, curd, callback_func, callback_arg);
       }

       if (newd)     free(newd);
       if (curd)     free(curd);
       free(dir);
}

Here is the call graph for this function:

Here is the caller graph for this function: