summaryrefslogtreecommitdiffstats
path: root/util/mailangel.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/mailangel.c')
-rw-r--r--util/mailangel.c143
1 files changed, 143 insertions, 0 deletions
diff --git a/util/mailangel.c b/util/mailangel.c
new file mode 100644
index 00000000..f873188c
--- /dev/null
+++ b/util/mailangel.c
@@ -0,0 +1,143 @@
+/* $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->mailalert=1;
+ 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 */