summaryrefslogblamecommitdiffstats
path: root/util/mailangel.c
blob: 93d9524b641c0619548a0a496e6d4077c2cdb8f3 (plain) (tree)















































                                                                            
                                      





























































































                                                                     
/* $Id$ */
#include "bbs.h"

#ifndef PLAY_ANGEL
int main(){ return 0; }
#else

int total[MAX_USERS + 1];
int *list;
int count;
char *mailto = NULL;
char *mailfile = NULL;

int ListCmp(const void * a, const void * b){
    return *(int*)b - *(int*)a;
}

int RejCmp(const void * a, const void * b){
    return strcasecmp(SHM->userid[*(int*)a - 1], SHM->userid[*(int*)b - 1]);
}

void readData();
void sendResult();
void mailUser(char *userid);

int main(int argc, char* argv[]){
    if (argc < 2) {
    fprintf(stderr, "Usage: %s file [userid]\n", argv[0]);
    exit(1);
    }
    mailfile = argv[1];

    if (argc > 2)
    mailto = argv[2];

    readData();
    if (mailto)
    mailUser(mailto);
    else
    sendResult();

    return 0;
}

int mailalertuser(char* userid)
{
    userinfo_t *uentp=NULL;
    if (userid[0] && (uentp = search_ulist_userid(userid)))
    uentp->alerts|=ALERT_NEW_MAIL;
    return 0;
}      

void readData(){
    int i, j;
    userec_t user;
    FILE* fp;

    attach_SHM();

    fp = fopen(BBSHOME "/.PASSWDS", "rb");
    j = count = 0;
    while (fread(&user, sizeof(userec_t), 1, fp) == 1) {
    ++j; /* j == uid */
    if (user.userlevel & PERM_ANGEL) {
        ++count;
        ++total[j]; /* make all angel have total > 0 */
    } else { /* don't have PERM_ANGEL */
        total[j] = INT_MIN;
    }
    }
    fclose(fp);

    list = (int *) malloc(count * sizeof(int));
    j = 0;
    for (i = 1; i <= MAX_USERS; ++i)
    if (total[i] > 0) {
        list[j] = i;
        ++j;
    }
}

void sendResult(){
    int i;
    for (i = 0; i < count; ++i) {
    mailUser(SHM->userid[list[i] - 1]);
//  printf("%s\n", SHM->userid[list[i] - 1]);
    }
}

void mailUser(char *userid)
{
    int count;
    FILE *fp, *fp2;
    time4_t t;
    fileheader_t header;
    struct stat st;
    char filename[512];

    fp2 = fopen(mailfile, "r");
    if (fp2 == NULL) {
    fprintf(stderr, "Cannot open file %s\n", mailfile);
    return;
    }

    sprintf(filename, BBSHOME "/home/%c/%s", userid[0], userid);
    if (stat(filename, &st) == -1) {
    if (mkdir(filename, 0755) == -1) {
        fprintf(stderr, "mail box create error %s \n", filename);
        return;
    }
    }
    else if (!(st.st_mode & S_IFDIR)) {
    fprintf(stderr, "mail box error\n");
    return;
    }

    stampfile(filename, &header);
    fp = fopen(filename, "w");
    if (fp == NULL) {
    fprintf(stderr, "Cannot open file %s\n", filename);
    return;
    }

    t = time(NULL);
    fprintf(fp, "作者: 小天使系統\n"
        "標題: 給小天使的一封信\n"
        "時間: %s\n",
        ctime4(&t));

    while ((count = fread(filename, 1, sizeof(filename), fp2))) {
    fwrite(filename, 1, count, fp);
    }
    fclose(fp);
    fclose(fp2);

    strcpy(header.title, "給小天使的一封信");
    strcpy(header.owner, "小天使系統");
    sprintf(filename, BBSHOME "/home/%c/%s/.DIR", userid[0], userid);
    append_record(filename, &header, sizeof(header));
    mailalertuser(userid);
    printf("%s\n", userid);
}
#endif /* defined PLAY_ANGEL */