Hi,

Almost a year ago I was looking at adding skel dir capability to
vpopmail (check the archives - 23/11/04 !).

For one reason or another I never quite got round to it.

However, tonight I've started putting something together.

The thing is, I've not done much programming in C before. Pascal, sure.
Perl - I'm a wizard :)

So, I've put together a section of code, which may or may not be valid
C, and would appreciate comments.

Introduction
============
This code is intended to add skel dir functionality to vpopmail.

It first looks for a domain-specific skel dir in:

 /home/vpopmail/etc/domains/<domain>/skel

It then looks for a installation-specific skel dir in;

  /home/vpopmail/etc/skel

If neither are found, it creates the default maildir structure.

===== snippet of vpopmail.c ==========
    /* Initialise a couple of strings to hold directory paths
    char skel_dir[MAX_BUFF];
    char skel_location[MAX_BUFF];


    /* initialise skel dir to empty */
    strcpy(skel_dir,"");

    /* first directory to check */
    snprintf(skel_location, sizeof(skel_location),
             "%s/etc/domains/%s/skel",
             VPOPMAILDIR, domain);

    /* check if it exists + is readable */
    if (check_dir_readable(skel_location)) {

      /* set the skel dir */
      snprintf(skel_dir, sizeof(skel_dir), "%s", skel_location)

    } else {

      /* next directory to check */
      snprintf(skel_location, sizeof(skel_location),
               "%s/etc/skel",
               VPOPMAILDIR);

      /* check if it exists + is readable */
      if (check_dir_readable(skel_location)) {

        /* set the skel dir */
        snprintf(skel_dir, sizeof(skel_dir), "%s", skel_location);

      }
    };

    /* if one of the skel dirs exists, use it */
    if (skel_dir <> "") {

      /* copy it to the newly-created user dir */
      copydir(skel_dir, ".");

    } else {

      /* otherwise, create the default dir structure    */
      /* (this is core vpopmail code)                   */
      for (i = 0; i < sizeof(dirnames)/sizeof(dirnames[0]); i++) {
        if (mkdir(dirnames[i],VPOPMAIL_DIR_MODE) == -1){
          fprintf(stderr, "make_user_dir: failed on %s\n", dirnames[i]);
          /* back out of changes made above */
          chdir("..");
          vdelfiles(username);
          chdir(calling_dir);
          return(NULL);
        }
      }
    }

===== snippet of vpopmail.c ==========

I've not yet written the check_dir_readable() or copydir() functions;
check_dir_readable may be really easy (it is in Perl :) ) but I've not
looked into how to implement it. copydir() is probably already available
somewhere if I have a quick google.

I'd appreciate any comments before I go any further with this.

Thanks,

R.
-- 
http://robinbowes.com

If a man speaks in a forest,
and his wife's not there,
is he still wrong?

Reply via email to