void intro(void) { string sTemp; printf ("\n\n"); printf (" *************************************\n"); printf (" * *\n"); printf (" * *\n"); printf (" * * * Super Star Trek * * *\n"); printf (" * *\n"); printf (" * *\n"); printf (" *************************************\n\n\n\n\n"); printf("\nDo you need instructions (y/n): "); reads(sTemp); if (sTemp[0] == 'y' || sTemp[0] == 'Y') showfile("startrek.doc"); printf ("\n\n\n\n"); printf(" ------*------\n"); printf(" ------------- `--- ------'\n"); printf(" `-------- --' / /\n"); printf(" \\\\------- --\n"); printf(" '-----------'\n"); printf("\n The USS Enterprise --- NCC - 1701\n\n\n"); }
void subfunc2(void) { char fname[MAXSTRLEN]; strcpy(fname, FNAME); if (getfname ("File to browse:", fname, 50)) showfile(fname); }
int bbsnewmail_main() { FILE *fp; struct fileheader x; int total = 0, total2 = 0; char dir[80]; if (!loginok || isguest) http_fatal("您尚未登录, 请先登录"); sprintf(dir, "mail/%c/%s/.DIR", mytoupper(currentuser->userid[0]), currentuser->userid); if (cache_header(file_time(dir), 1)) return 0; html_header(1); //check_msg(); changemode(RMAIL); //去掉了框架 printf("<body topmargin=0 leftMargin=1 MARGINWIDTH=1 MARGINHEIGHT=0>" WWWLEFT_DIV); printf("<center>\n"); printf ("%s -- 未读邮件列表 [使用者: %s] [信箱容量: %dk, 已用空间: %dk]<hr>\n", BBSNAME, currentuser->userid, max_mailsize(currentuser), get_mailsize(currentuser)); fp = fopen(dir, "r"); if (fp == 0) http_fatal("目前您的信箱没有任何信件"); printf("<table border=1>\n"); printf ("<tr><td>序号</td><td>状态</td><td>发信人</td><td>日期</td><td>信件标题</td></tr>\n"); while (1) { if (fread(&x, sizeof (x), 1, fp) <= 0) break; total++; if (x.accessed & FH_READ) continue; printf("<tr><td>%d</td><td>N</td>", total); printf("<td>%s</td>", userid_str(fh2owner(&x))); printf("<td>%6.6s</td>", Ctime(x.filetime) + 4); printf("<td><a href=bbsmailcon?file=%s&num=%d>", fh2fname(&x), total - 1); if (strncmp("Re: ", x.title, 4)) printf("★ "); hprintf("%42.42s", void1(x.title)); printf(" </a></td></tr>\n"); total2++; } fclose(fp); printf("</table><hr>\n"); printf("您的信箱共有%d封信件, 其中新信%d封.", total, total2); printf("</center>"); showfile(MY_BBS_HOME "/wwwtmp/googleanalytics"); // printf("</body>"); //修改框架,页面底部 printf(WWWFOOT_DIV "</body></html>\n"); http_quit(); return 0; }
int bbsupload_main() { char *ptr; char userattachpath[256]; int totalsize; html_header(1); printf("<body><center><div class=swidth style=\"text-align:left\">"); if (!loginok || isguest) http_fatal("请先登录"); if (!user_perm(currentuser, PERM_POST)) http_fatal("缺乏 POST 权限"); snprintf(userattachpath, sizeof (userattachpath), PATHUSERATTACH "/%s", currentuser->userid); mkdir(userattachpath, 0760); ptr = getparm("del"); if (*ptr) { upload_do_del(userattachpath, ptr); totalsize = upload_getpathsize(userattachpath, 1); if (totalsize < MAXATTACHSIZE) printuploadform(); showfile(MY_BBS_HOME "/wwwtmp/googleanalytics"); printf("</body></html>"); return 0; } totalsize = upload_getpathsize(userattachpath, 0); if (totalsize < 0) http_fatal("无法检测目录大小"); totalsize = save_attach(userattachpath, totalsize); /* Cleanup. */ totalsize = upload_getpathsize(userattachpath, 1); if (totalsize < MAXATTACHSIZE) printuploadform(); printf("</div></center>"); showfile(MY_BBS_HOME "/wwwtmp/googleanalytics"); printf("</body></html>"); return 0; }
static void spawn_login(struct passwd *pwd, const char *tty, const char *id) { char *p, buf[50]; /* utmp */ ut.ut_type = USER_PROCESS; ut.ut_pid = getpid(); strncpy(ut.ut_line, tty, UT_LINESIZE); strncpy(ut.ut_id, id, 2); time(&ut.ut_time); strncpy(ut.ut_user, pwd->pw_name, UT_NAMESIZE); pututline(&ut); /* Don't leak utmp into the child */ endutent(); /* We don't care if initgroups fails - it only grants extra rights */ //initgroups(pwd->pw_name, pwd->pw_gid); /* But we do care if these fail! */ if (setgid(pwd->pw_gid) == -1 || setuid(pwd->pw_uid) == -1) _exit(255); signal(SIGINT, SIG_DFL); /* setup user environment variables */ envset("LOGNAME", pwd->pw_name); envset("HOME", pwd->pw_dir); envset("SHELL", pwd->pw_shell); /* home directory */ if (chdir(pwd->pw_dir)) putstr("login: unable to change to home directory, using /\n"); /* show the motd file */ if (!showfile("/etc/motd")) crlf(); /* and spawn the shell */ strcpy(buf, "-"); if ((p = strrchr(pwd->pw_shell, '/')) != NULL) strcat(buf, ++p); else strcat(buf, pwd->pw_shell); argp[0] = buf; argp[1] = NULL; execve(pwd->pw_shell, (void *) argp, (void *) env); putstr("login: can't execute shell\n"); exit(1); }
static void redraw(void) { desktops(5); memory(90); loadaverage(400); procs(550); cpubar(650); showfile(750); datetime(); }
int bbsfind_main() { char user[32], title3[80], title[80], title2[80]; int day; html_header(1); //check_msg(); changemode(READING); strsncpy(user, getparm("user"), 13); strsncpy(title, getparm("title"), 50); strsncpy(title2, getparm("title2"), 50); strsncpy(title3, getparm("title3"), 50); day = atoi(getparm("day")); printf("<body>"); if (day == 0) { printf("%s -- 站内文章查询<hr>\n", BBSNAME); printf ("<font color=red>用户查询请使用各版面上的 版内查询 功能,此查询主要供管理人员使用</font>" "<br> 目前系统负载 %f。系统负载超过 1.5 或者上线人数超过 %d 时将不能进行查询。<br>" "系统负载统计图和上线人数统计图可以到<a href=home?B=bbslists>bbslists版</a>查看<br>", *system_load(), ONLINELIMIT); if (!loginok || isguest) printf("<b>您还没有登录,请先登录再使用本功能</b><br>"); printf("<form action=bbsfind>\n"); printf ("文章作者: <input maxlength=12 size=12 type=text name=user> (不填查找所有作者)<br>\n"); printf ("标题含有: <input maxlength=60 size=20 type=text name=title>"); printf (" AND <input maxlength=60 size=20 type=text name=title2><br>\n"); printf ("标题不含: <input maxlength=60 size=20 type=text name=title3><br>\n"); printf ("查找最近: <input maxlength=5 size=5 type=text name=day value=7> 天以内的文章<br><br>\n"); printf("<input type=submit value=提交查询></form>\n"); } else { if (*system_load() >= 1.7 || count_online() > ONLINELIMIT) http_fatal ("用户查询请使用各版面上的 版内查询 功能,此查询主要供管理人员使用。系统负载(%f)或上线人数(%d)过高, 请在上站人数较少的时间查询( 系统负载超过 1.5 或者上线人数超过 %d 时不能进行查询 )", *system_load(), count_online(), ONLINELIMIT); if (!loginok || isguest) http_fatal("请先登录再使用本功能。"); search(user, title, title2, title3, day * 86400); } // printSoukeForm(); showfile(MY_BBS_HOME "/wwwtmp/googleanalytics"); printf("</body>"); http_quit(); return 0; }
static void printEntry(struct Blog *blog, int i) { struct BlogHeader *blh; char buf[256]; blh = &blog->index[i]; printf("<entry>"); printf("<title>%s</title>", nohtml(blh->title)); printf("<link href=\"blogread?U=%s&T=%d\" />", blog->config->useridEN, (int) blh->fileTime); printf("<id>%s</id>", makeTag(blog, &blh->fileTime)); printf("<updated>%s</updated>", atomctime(&blh->fileTime)); //printf("<author><name>%s</name></author>", blog->config->useridUTF8); //printf("<issued>%s</issued>", gmtctime(&blh->fileTime)); /* for (i = 0; i < blog->nTag; i++) { if (!*blog->tag[i].title || !blog->tag[i].count || blog->tag[i].hide) continue; printf("<category>%s</category>", nohtml(blog->tag[i].title)); } */ printf("<summary type=\"html\"><![CDATA["); if (blh->hasAbstract) { setBlogAbstract(buf, blog->userid, blh->fileTime); showfile(buf); printf ("<br /><a href=\"blogread?U=%s&T=%d\">(继续阅读...)</a>", blog->config->useridEN, (int) blh->fileTime); } else { setBlogPost(buf, blog->userid, blh->fileTime); showfile(buf); } printf("]]></summary>"); printf("</entry>"); }
int showsecpage(const struct sectree *sec, struct boardmem *(data[]), int total, char *secstr) { FILE *fp; char buf[1024]; sprintf(buf, "wwwtmp/secpage.sec%s", sec->basestr); fp = fopen(buf, "rt"); if (!fp) return showdefaultsecpage(sec, data, total, secstr); while (fgets(buf, sizeof (buf), fp)) { if (buf[0] != '#') { fputs(buf, stdout); continue; } if (!strncmp(buf, "#showfile ", 10)) { char *ptr; ptr = strchr(buf, '\n'); if (ptr) *ptr = 0; showfile(buf + 10); } else if (!strncmp(buf, "#showblist", 10)) { if (total) /* modified by freely@BMY@20060525 */ showboardlist(data, total, secstr, sec); //showboardlist(data, total, secstr); } /* modified by freely@BMY@20060529 showsecintro 函数功能改变,注释掉*/ /* else if (!strncmp(buf, "#showsecintro", 13)) showsecintro(sec); */ else if (!strncmp(buf, "#showsecnav", 11)) showsecnav(sec); else if (!strncmp(buf, "#showstarline ", 14)) showstarline(buf + 14); else if (!strncmp(buf, "#showhotboard", 13)) showhotboard(sec, buf + 13); else if (!strncmp(buf, "#showsechead", 12)) showsechead(sec); else if (!strncmp(buf, "#showsecmanager", 8)) showsecmanager(sec); } fclose(fp); return 0; }
int bbsshowfile_main() { char *filename; int i; html_header(1); filename = getparm("F"); for (i = 0; flist[i][0]; i++) { if (!strcmp(filename, flist[i][0])) break; } if (!flist[i][0]) http_fatal("File not found"); filename = flist[i][1]; showfile(filename); printf("</body></html>"); return 0; }
int main(int argc, const char* argv[] ) { fmount(); if (strcmp(argv[0], "help") == 0) help(); else if (strcmp(argv[0], "structure") == 0) if (mounted) structure(); else printf("You must mount a floppy first.\n"); else if(strcmp(argv[0], "showsector") == 0) if (mounted) showsector(argv); else printf("You must mount a floppy first.\n"); else if(strcmp(argv[0], "traverse") == 0) if (mounted) traverse(argc, argv); else printf("You must mount a floppy first.\n"); else if(strcmp(argv[0], "showfat") == 0) if (mounted) showfat(); else printf("You must mount a floppy first.\n"); else if(strcmp(argv[0], "showfile") == 0) if (mounted) showfile(argv); else printf("You must mount a floppy first.\n"); else if (strcmp(argv[0], "quit") == 0) return 0; else { printf("%s command not supported.\n", argv[0]); return -1; } //if (fork() == 0) //printf("Other command needed"); //TODO OTHER COMMANDS: FORK EXEC INTO THEM OR RETURN ERROR MESSAGE return 1; }
int printBlogArticle(struct Blog *blog, int n) { struct BlogHeader *blh; char filePath[80]; int i, s, t; if (n < 0 || n >= blog->nIndex) return -1; blh = &blog->index[n]; setBlogPost(filePath, blog->userid, blh->fileTime); printf("<h2 class=posttitle>"); printf("%s", nohtml(blh->title)); printf("</h2>"); printf("<small>%s 发表于 %s</small>", blog->config->useridUTF8, Ctime(blh->fileTime)); printf("<div class=postcontent>"); showfile(filePath); printf("</div>"); printf("<div class=postfoot>"); s = blh->subject; printf("栏目:%s", nohtml(blog->subject[s].title)); printf(" | Tags:"); for (i = 0; i < MAXTAG; ++i) { t = blh->tag[i]; if (t < 0 || t >= blog->nTag) continue; if (! *blog->tag[t].title) continue; printf("%s ", nohtml(blog->tag[t].title)); } printf(" | 评论(%d)", blh->nComment); if (!strcmp(currentuser->userid, blog->userid)) printf(" | <a href=blogpost?T=%d>编辑</a>", blh->fileTime); printf("</div>"); return 0; }
int main (int argc, char **argv) { int anot = 0, inplace = 1, nedit = 0; int nwhat = 0, i, in, isdf = 0, out; char *cp, *cwd, *maildir, *msgnam, *dfolder = NULL; char *dmsg = NULL, *ed = NULL, *file = NULL, *folder = NULL; char *form = NULL, *msg = NULL, buf[BUFSIZ], drft[BUFSIZ]; char **argp, **arguments; struct msgs *mp = NULL; struct stat st; #ifdef LOCALE setlocale(LC_ALL, ""); #endif invo_name = r1bindex (argv[0], '/'); /* read user profile/context */ context_read(); arguments = getarguments (invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch (++cp, switches)) { case AMBIGSW: ambigsw (cp, switches); done (1); case UNKWNSW: adios (NULL, "-%s unknown", cp); case HELPSW: snprintf (buf, sizeof(buf), "%s [+folder] [msg] [switches]", invo_name); print_help (buf, switches, 1); done (1); case VERSIONSW: print_version(invo_name); done (1); case ANNOSW: anot++; continue; case NANNOSW: anot = 0; continue; case EDITRSW: if (!(ed = *argp++) || *ed == '-') adios (NULL, "missing argument to %s", argp[-2]); nedit = 0; continue; case NEDITSW: nedit++; continue; case WHATSW: if (!(whatnowproc = *argp++) || *whatnowproc == '-') adios (NULL, "missing argument to %s", argp[-2]); nwhat = 0; continue; case NWHATSW: nwhat++; continue; case FILESW: if (file) adios (NULL, "only one file at a time!"); if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); file = path (cp, TFILE); continue; case FORMSW: if (!(form = *argp++) || *form == '-') adios (NULL, "missing argument to %s", argp[-2]); continue; case INPLSW: inplace++; continue; case NINPLSW: inplace = 0; continue; case DFOLDSW: if (dfolder) adios (NULL, "only one draft folder at a time!"); if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp, *cp != '@' ? TFOLDER : TSUBCWF); continue; case DMSGSW: if (dmsg) adios (NULL, "only one draft message at a time!"); if (!(dmsg = *argp++) || *dmsg == '-') adios (NULL, "missing argument to %s", argp[-2]); continue; case NDFLDSW: dfolder = NULL; isdf = NOTOK; continue; } } if (*cp == '+' || *cp == '@') { if (folder) adios (NULL, "only one folder at a time!"); else folder = pluspath (cp); } else { if (msg) adios (NULL, "only one message at a time!"); else msg = cp; } } cwd = getcpy (pwd ()); if (!context_find ("path")) free (path ("./", TFOLDER)); if (file && (msg || folder)) adios (NULL, "can't mix files and folders/msgs"); in = open_form(&form, distcomps); try_it_again: strncpy (drft, m_draft (dfolder, dmsg, NOUSE, &isdf), sizeof(drft)); /* Check if draft already exists */ if (stat (drft, &st) != NOTOK) { printf ("Draft \"%s\" exists (%ld bytes).", drft, (long) st.st_size); for (i = LISTDSW; i != YESW;) { if (!(argp = getans ("\nDisposition? ", isdf ? aqrnl : aqrl))) done (1); switch (i = smatch (*argp, isdf ? aqrnl : aqrl)) { case NOSW: done (0); case NEWSW: dmsg = NULL; goto try_it_again; case YESW: break; case LISTDSW: showfile (++argp, drft); break; case REFILSW: if (refile (++argp, drft) == 0) i = YESW; break; default: advise (NULL, "say what?"); break; } } } if ((out = creat (drft, m_gmprot ())) == NOTOK) adios (drft, "unable to create"); cpydata (in, out, form, drft); close (in); close (out); if (file) { /* * Dist a file */ anot = 0; /* don't want to annotate a file */ } else { /* * Dist a message */ if (!msg) msg = "cur"; if (!folder) folder = getfolder (1); maildir = m_maildir (folder); if (chdir (maildir) == NOTOK) adios (maildir, "unable to change directory to"); /* read folder and create message structure */ if (!(mp = folder_read (folder))) adios (NULL, "unable to read folder %s", folder); /* check for empty folder */ if (mp->nummsg == 0) adios (NULL, "no messages in %s", folder); /* parse the message range/sequence/name and set SELECTED */ if (!m_convert (mp, msg)) done (1); seq_setprev (mp); /* set the previous-sequence */ if (mp->numsel > 1) adios (NULL, "only one message at a time!"); } msgnam = file ? file : getcpy (m_name (mp->lowsel)); if ((in = open (msgnam, O_RDONLY)) == NOTOK) adios (msgnam, "unable to open message"); if (!file) { context_replace (pfolder, folder);/* update current folder */ seq_setcur (mp, mp->lowsel); /* update current message */ seq_save (mp); /* synchronize sequences */ context_save (); /* save the context file */ } if (nwhat) done (0); what_now (ed, nedit, NOUSE, drft, msgnam, 1, mp, anot ? "Resent" : NULL, inplace, cwd); done (1); return 1; }
int bbsbkndoc_main() { FILE *fp; char board[80], bkn[80], dir[160], *ptr, genbuf[STRLEN]; struct boardmem *x1; struct fileheader x; int i, start, total; html_header(1); printf("<script src=" BBSJS "></script>\n"); changemode(BACKNUMBER); //check_msg(); getparmboard(board, sizeof(board)); strsncpy(bkn, getparm("bkn"), 32); ptr = bkn; while (*ptr) { if (*ptr != 'B' && *ptr != '.' && !isdigit(*ptr)) http_fatal("错误的过刊号"); ptr++; } if (strlen(bkn) < 3) http_fatal("错误的过刊号"); x1 = getboard(board); if (x1 == 0) nosuchboard(board, "bbsbkndoc"); else { updateinboard(x1); strcpy(board, x1->header.filename); sprintf(dir, "boards/.backnumbers/%s/%s", board, bkn); if (!file_exist(dir)) http_fatal("没有这卷过刊"); sprintf(dir, "boards/.backnumbers/%s/%s/.DIR", board, bkn); fp = fopen(dir, "r"); total = file_size(dir) / sizeof (struct fileheader); start = getdocstart(total, w_info->t_lines); printf("<body topmargin=0>"); printf("<nobr><center>\n"); sprintf(genbuf, "阅览过刊 文章数[%d]", total); printboardtop(x1, 5, genbuf); if (total <= 0) http_fatal("本卷过刊目前没有文章"); printf("<table cellSpacing=0 cellPadding=2>\n"); printf ("<tr class=docbgcolor><td>序号<td>状态<td>作者<td>日期<td>标题<td>星级<td>评价</td>\n"); if (fp) { fseek(fp, (start - 1) * sizeof (struct fileheader), SEEK_SET); for (i = 0; i < w_info->t_lines; i++) { char filename[255]; char *ptr; if (fread(&x, sizeof (x), 1, fp) <= 0) break; if (x.accessed & FH_HIDE) { printf ("<tr><td>%d<td> <td>不详<td>不详<td>-本文已经被删除-<td>\n", start + i); continue; } ptr = flag_str2(x.accessed, 1); sprintf(filename, "boards/.backnumbers/%s/%s/%s", board, bkn, fh2fname(&x)); printf("<tr><td>%d<td>%s<td>%s", start + i, ptr, userid_str(x.owner)); printf("<td>%12.12s", Ctime(x.filetime) + 4); x.title[40] = 0; printf ("<td><a href=bbsbkncon?B=%d&bkn=%s&file=%s&num=%d>%s%s </a>%s", getbnumx(x1), bkn, fh2fname(&x), start + i - 1, strncmp(x.title, "Re: ", 4) ? "○ " : "", void1(titlestr(x.title)), size_str(eff_size(filename))); printf("<td><font color=%s>%d</font>\n", x.staravg50 ? "red" : "black", x.staravg50 / 50); printf("<td><font color=%s>%d人</font>\n", x.hasvoted ? "red" : "black", x.hasvoted); } printf("</table>"); printhr(); fclose(fp); } sprintf(genbuf, "bbsbkndoc?B=%d&bkn=%s", getbnumx(x1), bkn); bbsdoc_helper(genbuf, start, total, w_info->t_lines); printf("<table><tr><td><form name=form1 action=bbsbkndoc>\n"); printf("<input type=hidden name=B value=%d>", getbnumx(x1)); printf("<input type=hidden name=bkn value=%s>", bkn); printf ("<input type=submit value=跳转到> 第 <input type=text name=start size=4> 篇"); printf("</form>\n"); printf("</td><td><form name=form2 action=bbsdoc>\n"); printf ("<input type=submit value=跳转到><input type=text name=board size=5> 讨论区"); printf("</form></td></tr></table>\n"); showfile(MY_BBS_HOME "/wwwtmp/googleanalytics"); printf("</body>"); http_quit(); } return 0; }
/* * Internal implementation of "getty" and "login" */ static pid_t getty(const char *ttyname, const char *id) { int fdtty, pid; struct passwd *pwd; const char *pr; char *p, buf[50], salt[3]; char hn[64]; gethostname(hn, sizeof(hn)); for (;;) { pid = fork(); if (pid == -1) { putstr("init: can't fork\n"); } else { if (pid != 0) /* parent's context: return pid of the child process */ return pid; close(0); close(1); close(2); setpgrp(); setpgid(0,0); /* Throw all the init working spacd we inherited */ brk_warn(membase); fdtty = open(ttyname, O_RDWR); if (fdtty < 0) return -1; /* here we are inside child's context of execution */ envset("PATH", "/bin:/usr/bin"); envset("CTTY", ttyname); /* make stdin, stdout and stderr point to fdtty */ dup(fdtty); dup(fdtty); ut.ut_type = INIT_PROCESS; ut.ut_pid = getpid(); ut.ut_id[0] = id[0]; ut.ut_id[1] = id[1]; pututline(&ut); /* display the /etc/issue file, if exists */ showfile("/etc/issue"); if (*hn) { putstr(hn); putstr(" "); } /* loop until a valid user name is entered * and a shell is spawned */ for (;;) { putstr("login: "******"Password: "******""; } if (strcmp(pr, pwd->pw_passwd) == 0) spawn_login(pwd, ttyname, id); } putstr("\nLogin incorrect\n\n"); signal(SIGALRM, sigalarm); alarm(2); pause(); } } } }
void subfunc1(void) { showfile(FNAME); }
int main (int argc, char **argv) { int msgp = 0, distsw = 0, vecp; int isdf = 0, mime = 0; int msgnum, status; char *cp, *dfolder = NULL, *maildir = NULL; char buf[BUFSIZ], **ap, **argp, **arguments, *program; char *msgs[MAXARGS], **vec; struct msgs *mp; struct stat st; if (nmh_init(argv[0], 1)) { return 1; } arguments = getarguments (invo_name, argc, argv, 1); argp = arguments; vec = argsplit(postproc, &program, &vecp); vec[vecp++] = "-library"; vec[vecp++] = getcpy (m_maildir ("")); if ((cp = context_find ("fileproc"))) { vec[vecp++] = "-fileproc"; vec[vecp++] = cp; } if ((cp = context_find ("mhlproc"))) { vec[vecp++] = "-mhlproc"; vec[vecp++] = cp; } if ((cp = context_find ("credentials"))) { /* post doesn't read context so need to pass credentials. */ vec[vecp++] = "-credentials"; vec[vecp++] = cp; } while ((cp = *argp++)) { if (*cp == '-') { switch (smatch (++cp, switches)) { case AMBIGSW: ambigsw (cp, switches); done (1); case UNKWNSW: adios (NULL, "-%s unknown\n", cp); case HELPSW: snprintf (buf, sizeof(buf), "%s [file] [switches]", invo_name); print_help (buf, switches, 1); done (0); case VERSIONSW: print_version(invo_name); done (0); case DRAFTSW: msgs[msgp++] = draft; continue; case DFOLDSW: if (dfolder) adios (NULL, "only one draft folder at a time!"); if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp, *cp != '@' ? TFOLDER : TSUBCWF); continue; case DMSGSW: if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); msgs[msgp++] = cp; continue; case NDFLDSW: dfolder = NULL; isdf = NOTOK; continue; case PUSHSW: pushsw++; continue; case NPUSHSW: pushsw = 0; continue; case SPLITSW: if (!(cp = *argp++) || sscanf (cp, "%d", &splitsw) != 1) adios (NULL, "missing argument to %s", argp[-2]); continue; case UNIQSW: unique++; continue; case NUNIQSW: unique = 0; continue; case FORWSW: forwsw++; continue; case NFORWSW: forwsw = 0; continue; case VERBSW: verbsw++; vec[vecp++] = --cp; continue; case NVERBSW: verbsw = 0; vec[vecp++] = --cp; continue; case MIMESW: mime++; vec[vecp++] = --cp; continue; case NMIMESW: mime = 0; vec[vecp++] = --cp; continue; case DEBUGSW: debugsw++; /* fall */ case NFILTSW: case FRMTSW: case NFRMTSW: case BITSTUFFSW: case NBITSTUFFSW: case MSGDSW: case NMSGDSW: case WATCSW: case NWATCSW: case SNOOPSW: case SASLSW: case NOSASLSW: case TLSSW: case INITTLSSW: case NTLSSW: vec[vecp++] = --cp; continue; case ALIASW: case FILTSW: case WIDTHSW: case CLIESW: case SERVSW: case SASLMECHSW: case SASLMXSSFSW: case USERSW: case PORTSW: case MTSSW: case MESSAGEIDSW: vec[vecp++] = --cp; if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); vec[vecp++] = cp; continue; case ATTACHSW: advise(NULL, "The -attach switch is deprecated"); continue; case NOATTACHSW: advise(NULL, "The -noattach switch is deprecated"); continue; case ATTACHFORMATSW: advise(NULL, "The -attachformat switch is deprecated"); continue; } } else { msgs[msgp++] = cp; } } /* * check for "Aliasfile:" profile entry */ if ((cp = context_find ("Aliasfile"))) { char *dp = NULL; for (ap = brkstring(dp = getcpy(cp), " ", "\n"); ap && *ap; ap++) { vec[vecp++] = "-alias"; vec[vecp++] = *ap; } } if (dfolder == NULL) { if (msgp == 0) { msgs[msgp++] = getcpy (m_draft (NULL, NULL, 1, &isdf)); if (stat (msgs[0], &st) == NOTOK) adios (msgs[0], "unable to stat draft file"); cp = concat ("Use \"", msgs[0], "\"? ", NULL); for (status = LISTDSW; status != YESW;) { if (!(argp = getans (cp, anyl))) done (1); switch (status = smatch (*argp, anyl)) { case NOSW: done (0); case YESW: break; case LISTDSW: showfile (++argp, msgs[0]); break; default: advise (NULL, "say what?"); break; } } } else { for (msgnum = 0; msgnum < msgp; msgnum++) msgs[msgnum] = getcpy (m_maildir (msgs[msgnum])); } } else { if (!context_find ("path")) free (path ("./", TFOLDER)); if (!msgp) msgs[msgp++] = "cur"; maildir = m_maildir (dfolder); if (chdir (maildir) == NOTOK) adios (maildir, "unable to change directory to"); /* read folder and create message structure */ if (!(mp = folder_read (dfolder, 1))) adios (NULL, "unable to read folder %s", dfolder); /* check for empty folder */ if (mp->nummsg == 0) adios (NULL, "no messages in %s", dfolder); /* parse all the message ranges/sequences and set SELECTED */ for (msgnum = 0; msgnum < msgp; msgnum++) if (!m_convert (mp, msgs[msgnum])) done (1); seq_setprev (mp); /* set the previous-sequence */ for (msgp = 0, msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { if (is_selected (mp, msgnum)) { msgs[msgp++] = getcpy (m_name (msgnum)); unset_exists (mp, msgnum); } } mp->msgflags |= SEQMOD; seq_save (mp); } #ifdef WHATNOW go_to_it: #endif /* WHATNOW */ if ((cp = getenv ("SIGNATURE")) == NULL || *cp == 0) if ((cp = context_find ("signature")) && *cp) m_putenv ("SIGNATURE", cp); for (msgnum = 0; msgnum < msgp; msgnum++) if (stat (msgs[msgnum], &st) == NOTOK) adios (msgs[msgnum], "unable to stat draft file"); if ((annotext = getenv ("mhannotate")) == NULL || *annotext == 0) annotext = NULL; if (annotext && ((cp = getenv ("mhinplace")) != NULL && *cp != 0)) inplace = atoi (cp); if ((altmsg = getenv ("mhaltmsg")) == NULL || *altmsg == 0) altmsg = NULL; /* used by dist interface - see below */ if ((cp = getenv ("mhdist")) && *cp && (distsw = atoi (cp)) && altmsg) { vec[vecp++] = "-dist"; if ((cp = m_mktemp2(altmsg, invo_name, NULL, NULL)) == NULL) { adios(NULL, "unable to create temporary file in %s", get_temp_dir()); } distfile = getcpy (cp); (void) m_unlink(distfile); if (link (altmsg, distfile) == NOTOK) { /* Cygwin with FAT32 filesystem produces EPERM. */ if (errno != EXDEV && errno != EPERM #ifdef EISREMOTE && errno != EISREMOTE #endif /* EISREMOTE */ ) adios (distfile, "unable to link %s to", altmsg); free (distfile); if ((cp = m_mktemp2(NULL, invo_name, NULL, NULL)) == NULL) { adios(NULL, "unable to create temporary file in %s", get_temp_dir()); } distfile = getcpy (cp); { int in, out; struct stat st; if ((in = open (altmsg, O_RDONLY)) == NOTOK) adios (altmsg, "unable to open"); fstat(in, &st); if ((out = creat (distfile, (int) st.st_mode & 0777)) == NOTOK) adios (distfile, "unable to write"); cpydata (in, out, altmsg, distfile); close (in); close (out); } } } else { distfile = NULL; } if (altmsg == NULL || stat (altmsg, &st) == NOTOK) { st.st_mtime = 0; st.st_dev = 0; st.st_ino = 0; } if (pushsw) push (); status = 0; closefds (3); for (msgnum = 0; msgnum < msgp; msgnum++) { switch (sendsbr (vec, vecp, program, msgs[msgnum], &st, 1)) { case DONE: done (++status); case NOTOK: status++; /* fall */ case OK: break; } } context_save (); /* save the context file */ done (status); return 1; }
int main (int argc, char **argv) { int anot = 0, inplace = 1, mime = 0; int issue = 0, volume = 0, dashstuff = 0; int nedit = 0, nwhat = 0, i, in; int out, isdf = 0, msgnum = 0; int outputlinelen = OUTPUTLINELEN; int dat[5]; char *cp, *cwd, *maildir, *dfolder = NULL; char *dmsg = NULL, *digest = NULL, *ed = NULL; char *file = NULL, *filter = NULL, *folder = NULL, *fwdmsg = NULL; char *from = NULL, *to = NULL, *cc = NULL, *subject = NULL, *fcc = NULL; char *form = NULL, buf[BUFSIZ], value[10]; char **argp, **arguments; struct stat st; struct msgs_array msgs = { 0, 0, NULL }; int buildsw = 0; if (nmh_init(argv[0], 1)) { return 1; } arguments = getarguments (invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch (++cp, switches)) { case AMBIGSW: ambigsw (cp, switches); done (1); case UNKWNSW: adios (NULL, "-%s unknown", cp); case HELPSW: snprintf (buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name); print_help (buf, switches, 1); done (0); case VERSIONSW: print_version(invo_name); done (0); case ANNOSW: anot++; continue; case NANNOSW: anot = 0; continue; case EDITRSW: if (!(ed = *argp++) || *ed == '-') adios (NULL, "missing argument to %s", argp[-2]); nedit = 0; continue; case NEDITSW: nedit++; continue; case WHATSW: if (!(whatnowproc = *argp++) || *whatnowproc == '-') adios (NULL, "missing argument to %s", argp[-2]); nwhat = 0; continue; case BILDSW: buildsw++; /* fall... */ case NWHATSW: nwhat++; continue; case FILESW: if (file) adios (NULL, "only one file at a time!"); if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); file = path (cp, TFILE); continue; case FILTSW: if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); filter = getcpy (etcpath (cp)); mime = 0; continue; case FORMSW: if (!(form = *argp++) || *form == '-') adios (NULL, "missing argument to %s", argp[-2]); continue; case FRMTSW: filter = getcpy (etcpath (mhlforward)); continue; case NFRMTSW: filter = NULL; continue; case INPLSW: inplace++; continue; case NINPLSW: inplace = 0; continue; case MIMESW: mime++; filter = NULL; continue; case NMIMESW: mime = 0; continue; case DGSTSW: if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); digest = getcpy(cp); mime = 0; continue; case ISSUESW: if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); if ((issue = atoi (cp)) < 1) adios (NULL, "bad argument %s %s", argp[-2], cp); continue; case VOLUMSW: if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); if ((volume = atoi (cp)) < 1) adios (NULL, "bad argument %s %s", argp[-2], cp); continue; case DFOLDSW: if (dfolder) adios (NULL, "only one draft folder at a time!"); if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); dfolder = path (*cp == '+' || *cp == '@' ? cp + 1 : cp, *cp != '@' ? TFOLDER : TSUBCWF); continue; case DMSGSW: if (dmsg) adios (NULL, "only one draft message at a time!"); if (!(dmsg = *argp++) || *dmsg == '-') adios (NULL, "missing argument to %s", argp[-2]); continue; case NDFLDSW: dfolder = NULL; isdf = NOTOK; continue; case BITSTUFFSW: dashstuff = 1; /* trinary logic */ continue; case NBITSTUFFSW: dashstuff = -1; /* trinary logic */ continue; case FROMSW: if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); from = addlist(from, cp); continue; case TOSW: if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); to = addlist(to, cp); continue; case CCSW: if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); cc = addlist(cc, cp); continue; case FCCSW: if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); fcc = addlist(fcc, cp); continue; case SUBJECTSW: if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); subject = getcpy(cp); continue; case WIDTHSW: if (!(cp = *argp++) || *cp == '-') adios (NULL, "missing argument to %s", argp[-2]); if ((outputlinelen = atoi(cp)) < 10) adios (NULL, "impossible width %d", outputlinelen); continue; } } if (*cp == '+' || *cp == '@') { if (folder) adios (NULL, "only one folder at a time!"); else folder = pluspath (cp); } else { app_msgarg(&msgs, cp); } } cwd = getcpy (pwd ()); if (!context_find ("path")) free (path ("./", TFOLDER)); if (file && (msgs.size || folder)) adios (NULL, "can't mix files and folders/msgs"); try_it_again: strncpy (drft, buildsw ? m_maildir ("draft") : m_draft (dfolder, NULL, NOUSE, &isdf), sizeof(drft)); /* Check if a draft already exists */ if (!buildsw && stat (drft, &st) != NOTOK) { printf ("Draft \"%s\" exists (%ld bytes).", drft, (long) st.st_size); for (i = LISTDSW; i != YESW;) { if (!(argp = getans ("\nDisposition? ", isdf ? aqrnl : aqrl))) done (1); switch (i = smatch (*argp, isdf ? aqrnl : aqrl)) { case NOSW: done (0); case NEWSW: dmsg = NULL; goto try_it_again; case YESW: break; case LISTDSW: showfile (++argp, drft); break; case REFILSW: if (refile (++argp, drft) == 0) i = YESW; break; default: advise (NULL, "say what?"); break; } } } if (file) { /* * Forwarding a file. */ anot = 0; /* don't want to annotate a file */ } else { /* * Forwarding a message. */ if (!msgs.size) app_msgarg(&msgs, "cur"); if (!folder) folder = getfolder (1); maildir = m_maildir (folder); if (chdir (maildir) == NOTOK) adios (maildir, "unable to change directory to"); /* read folder and create message structure */ if (!(mp = folder_read (folder, 1))) adios (NULL, "unable to read folder %s", folder); /* check for empty folder */ if (mp->nummsg == 0) adios (NULL, "no messages in %s", folder); /* parse all the message ranges/sequences and set SELECTED */ for (msgnum = 0; msgnum < msgs.size; msgnum++) if (!m_convert (mp, msgs.msgs[msgnum])) done (1); seq_setprev (mp); /* set the previous sequence */ /* * Find the first message in our set and use it as the input * for the component scanner */ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) if (is_selected (mp, msgnum)) { fwdmsg = strdup(m_name(msgnum)); break; } if (! fwdmsg) adios (NULL, "Unable to find input message"); } if (filter && access (filter, R_OK) == NOTOK) adios (filter, "unable to read"); /* * Open form (component) file. */ if (digest) { if (issue == 0) { snprintf (buf, sizeof(buf), IFORMAT, digest); if (volume == 0 && (cp = context_find (buf)) && ((issue = atoi (cp)) < 0)) issue = 0; issue++; } if (volume == 0) { snprintf (buf, sizeof(buf), VFORMAT, digest); if ((cp = context_find (buf)) == NULL || (volume = atoi (cp)) <= 0) volume = 1; } if (!form) form = digestcomps; } else { if (!form) form = forwcomps; } dat[0] = digest ? issue : msgnum; dat[1] = volume; dat[2] = 0; dat[3] = outputlinelen; dat[4] = 0; in = build_form (form, digest, dat, from, to, cc, fcc, subject, file ? file : fwdmsg); if ((out = creat (drft, m_gmprot ())) == NOTOK) adios (drft, "unable to create"); /* * copy the components into the draft */ cpydata (in, out, form, drft); close (in); if (file) { /* just copy the file into the draft */ if ((in = open (file, O_RDONLY)) == NOTOK) adios (file, "unable to open"); cpydata (in, out, file, drft); close (in); close (out); } else { /* * If filter file is defined, then format the * messages into the draft using mhlproc. */ if (filter) mhl_draft (out, digest, volume, issue, drft, filter, dashstuff); else if (mime) copy_mime_draft (out); else copy_draft (out, digest, drft, volume, issue, dashstuff); close (out); if (digest) { snprintf (buf, sizeof(buf), IFORMAT, digest); snprintf (value, sizeof(value), "%d", issue); context_replace (buf, getcpy (value)); snprintf (buf, sizeof(buf), VFORMAT, digest); snprintf (value, sizeof(value), "%d", volume); context_replace (buf, getcpy (value)); } context_replace (pfolder, folder); /* update current folder */ seq_setcur (mp, mp->lowsel); /* update current message */ seq_save (mp); /* synchronize sequences */ context_save (); /* save the context file */ } if (nwhat) done (0); what_now (ed, nedit, NOUSE, drft, NULL, 0, mp, anot ? "Forwarded" : NULL, inplace, cwd, 0); done (1); return 1; }