/*
* postnew.c
*
* post article from bbs to newsserver
*
* by ZV 2002.4.24
*
* 说明:现在似乎很流行news<->bbs
* innbbsd确实很强大,我也写了一个程序直接提交发表
* 在BBS某个版上的文章,用news.cn99.com测试了一下子,效果
* 比较理想。
*
*
* TODO: 时间函数老是用不来,哪位改改吧,谢谢了.
*
*
*/
#include "/root/bbssrc/include/bbs.h"
/* iconf 的格式: 转信站地址 对方转信版面 本地转入版面 */
char *iconf[]={
"news.cn99.com cn.bbs.admin.test cnTest",
"news.cn99.com cn.bbs.admin cnAdmin",
NULL
};
/* 转信黑名单: 不转出这些人的文章 */
char *black_user[]={
"deliver",
"anonymous",
"guest",
"SYSOP",
"",
NULL
};
int valid_user(char *user) {
int i;
for(i=0; black_user[i]!=NULL; i++)
if(!strcasecmp(user, black_user[i])) return 0;
return 1;
}
int post_to_news(char *filename, char *board, char *author)
{
int fd;
int i, i2;
struct sockaddr_in xs;
struct hostent *he;
char host[80], oboard[80], iboard[80];
char reply[200], subject[200];
char content[100000], buf[100000];
int filesize;
FILE *fp;
/* time_t now = time(0);
char strnow[100];
sprintf(strnow, "%s", ctime(&now));
strnow[strlen(strnow)-1] = 0;*/
for(i=0; iconf[i]!=0; i++) {
sscanf(iconf[i], "%s %s %s", host, oboard, iboard);
if (strcmp(iboard, board) == 0) // equal
break;
}
if (strcmp(iboard, board) != 0) // 不用转信
return -1;
bzero(reply, sizeof(reply));
bzero((char*) &xs, sizeof(xs));
xs.sin_family=AF_INET;
if((he=gethostbyname(host))!=NULL)
bcopy(he->h_addr, (char*) &xs.sin_addr, he->h_length);
else
xs.sin_addr.s_addr=inet_addr(host);
xs.sin_port=htons(119);
fd=socket(AF_INET, SOCK_STREAM, 0);
if(connect(fd, (struct sockaddr*) &xs, sizeof(xs))<0) {
perror("can't conenct ");
return -1;
}
recvfrom(fd, reply, 200, 0, NULL, 0);
// printf("->%s", reply);
strcpy(reply, "post\n");
sendto(fd, reply, strlen(reply), 0, NULL, 0);
// printf("<-%s", reply);
recvfrom(fd, reply, 200, 0, NULL, 0);
// printf("->%s", reply);
if ((reply[0] == '3') && (reply[1] == '4') && (reply[2] == '0')) {
if ((fp=fopen(filename, "r")) == NULL) {
// perror("post file open error...");
return -1;
}
fseek(fp, 0, SEEK_END);
filesize = ftell(fp);
rewind(fp);
if (fread(content, filesize, 1, fp) != 1) {
// perror("read error");
fclose(fp);
return -1;
}
fclose(fp);
for (i=0; content[i]!='\n'; i++);
for (i++; content[i]!=':'; i++);
for (i+=2, i2=0; content[i]!='\n'; i++)
subject[i2++] = content[i];
subject[i2] = 0;
for (i++; content[i]!='\n'; i++)
i++;
sprintf(buf,
"From: 一网情深 <%s.bbs@bbs.uestc.edu.cn>\n"
"Newsgroups: %s\n"
"Subject: %s\n"
"Date: Mon, 22 Apr 2002 13:37:06 -0800\n"
"Lines: 3\n"
"X-Priority: 3\n"
"X-MSMail-Priority: Normal\n"
"X-Newsreader: 一网深情(bbs.uestc.edu.cn) deliver V1.01\n"
"X-MimeOLE: Produced By ZV 2002.4.24\n\n"
"%s\n"
".\n",
author, /*strnow,*/ oboard, subject, &content[i]);
sendto(fd, buf, strlen(buf), 0, NULL, 0);
// printf("%s", buf);
recvfrom(fd, reply, 200, 0, NULL, 0);
/* perror(reply);
if (reply[0]==2) perror("post ok.");
else perror("post error.");*/
} else {
// perror("post error...");
return -1;
}
return -1;
}
int main(int argc, char **argv)
{
// post_to_news("/home/ftp/bbs/boards/sysop/M.1019546291.A", "TestWatering", "TurboZV");
if (argc != 4)
// perror("postnews call error");
return -1;
else {
if (!valid_user(argv[3])) return -1;
if(fork()) exit(0);
post_to_news(argv[1], argv[2], argv[3]);
}
}
--
FROM 202.115.22.145