Annotation of researchv9/jerq/src/sysmon/scanmail.c, revision 1.1.1.1

1.1       root        1: #include <sys/types.h>
                      2: #include <dir.h>
                      3: #include <sys/stat.h>
                      4: #include <stdio.h>
                      5: #include "defs.h"
                      6: #include "scanmail.h"
                      7: 
                      8: /* import */
                      9: extern char *strcat(), *strcpy(), *strncpy();
                     10: 
                     11: /* init the file */
                     12: void
                     13: sminit (smp, file, name)
                     14:        struct scanmail *smp;
                     15:        char *file;
                     16:        char *name;
                     17: {
                     18:        char *p;
                     19:        struct stat buf;
                     20:        char dir[128];
                     21:        char *strrchr();
                     22:        char islog = FALSE;
                     23:        int fd;
                     24: 
                     25:        /* look for a mail log */
                     26:        if ((fd=open(MAILLOG, 0)) >= 0)
                     27:                islog = TRUE;
                     28:        close(fd);
                     29: 
                     30:        /* defaults */
                     31:        strcpy (smp->sm_match, "From ");
                     32:        smp->sm_log = FALSE;
                     33: 
                     34:        /* change directory to avoid screwing with namei */
                     35:        strcpy(dir, MAILDIR);
                     36:        strcat(dir, "/");
                     37:        strcat(dir, name);
                     38:        if (file == NULL || strcmp(dir, file) == 0) {
                     39: 
                     40:                /* use the standard mail directory if none is specified */
                     41:                chdir (MAILDIR);
                     42:                if (islog) {
                     43:                        smp->sm_log = TRUE;
                     44:                        strcpy (smp->sm_file, MAILNAME);
                     45:                        strcpy (smp->sm_match, "delivered ");
                     46:                        strcat (smp->sm_match, name);
                     47:                        strcat (smp->sm_match, " From ");
                     48:                } else {
                     49:                        strcpy (smp->sm_file, name);
                     50:                }
                     51:        } else {
                     52: 
                     53:                /* use whatever was specified */
                     54:                if ((p = strrchr(file, '/')) != NULL) {
                     55:                        strcpy (smp->sm_file, ++p);
                     56:                        strncpy (dir, file, p - file);
                     57:                        dir[p-file] = '\0';
                     58:                        chdir (dir);
                     59:                } else {
                     60:                        strcpy (smp->sm_file, file);
                     61:                }
                     62:        }
                     63: 
                     64:        /* get the end point */
                     65:        smp->sm_pos = (stat(smp->sm_file, &buf) < 0)? 0 : buf.st_size;
                     66: }
                     67: 
                     68: /* get the next header line (if the file has changed) */
                     69: char *
                     70: smnext (smp, fp)
                     71:        struct scanmail *smp;
                     72:        FILE *fp;
                     73: {
                     74:        struct stat buf;
                     75:        static char line[128];
                     76:        int len;
                     77:        char *sp=NULL, *mp, *ep;
                     78:        FILE *f;
                     79:        char *strchr();
                     80: 
                     81:        /* return if it hasn't gotten longer */
                     82:        if (stat(smp->sm_file, &buf) < 0)
                     83:                return 0;
                     84:        if (buf.st_size <= smp->sm_pos) {
                     85:                smp->sm_pos = buf.st_size;
                     86:                return 0;
                     87:        }
                     88: 
                     89:        /* it's grown, read it line by line */
                     90:        f = (fp != NULL && smp->sm_log) ? fp : fopen (smp->sm_file, "r");
                     91:        fseek (f, smp->sm_pos, 0);
                     92:        len = strlen(smp->sm_match);
                     93:        while (fgets(line, sizeof line, f) != NULL) {
                     94: 
                     95:                /* remember how far we've read */
                     96:                smp->sm_pos += strlen (line);
                     97: 
                     98:                /* look for a match */
                     99:                if (strncmp(line, smp->sm_match, strlen(smp->sm_match)) == 0) {
                    100: 
                    101:                        /* get the sender's name and machine */
                    102:                        ep = mp = line+len;
                    103:                        while (1) {
                    104:                                sp = mp;
                    105:                                mp = ep;
                    106:                                if ((ep = strchr(ep, '!')) == NULL)
                    107:                                        break;
                    108:                                ep++;
                    109:                        }
                    110:                        for (ep = sp; *ep != ' ' && *ep != '\0'; ep++)
                    111:                                ;
                    112:                        *ep = '\0';
                    113:                        break;
                    114:                }
                    115:        }
                    116:        if (fp == NULL || !smp->sm_log)
                    117:                fclose (f);
                    118:        return sp;
                    119: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.