示例#1
0
文件: signal.c 项目: foxfair/formosa
void
sig_segv(int sig)
{
	server->error++;
	server->sigsegv++;

#ifdef PRE_FORK
	(server->childs)[my_num].status = S_SIGSEGV;
	(server->childs)[my_num].pid = 0x00;
#endif

#ifdef WEB_ERROR_LOG
#if 1
	request_rec->atime = time(0);
#endif
	if (request_rec->mark1 != 0x55 || request_rec->mark2 != 0xaa)
	{
		fprintf(stderr, "ERR=\"Caught SIGSEGV\" request_rec data error!");
		weblog_line(server->error_log, "ERR=\"Caught SIGSEGV\" request_rec data error!");
	}
	else
	{
		fprintf(stderr, "ERR=\"Caught SIGSEGV\" REQ=\"%s %s\" UA=\"%s\"",
			request_rec->request_method, request_rec->URI, request_rec->user_agent);

		weblog_line(server->error_log, "ERR=\"Caught SIGSEGV\" REQ=\"%s %s\" UA=\"%s\"",
			    request_rec->request_method, request_rec->URI, request_rec->user_agent);
	}
	fflush(server->error_log);
#endif

	exit(11);		/* SIGSEGV 11 Core Segmentation Fault */
}
示例#2
0
文件: signal.c 项目: foxfair/formosa
void sig_segv(int sig)
{
	server->error++;
	server->sigsegv++;

#ifdef PRE_FORK
	(server->childs)[my_num].status = S_SIGSEGV;
	(server->childs)[my_num].pid = 0x00;
#endif

#ifdef WEB_ERROR_LOG
{
	char log[HTTP_REQUEST_LINE_BUF];
	if(request_rec->mark1 != 0x55 || request_rec->mark2 != 0xaa)
		sprintf(log, "ERR=\"Caught SIGSEGV\" request_rec data error!");
	else
		sprintf(log, "ERR=\"Caught SIGSEGV\" REQ=\"%s %s\" UA=\"%s\"",
			request_rec->request_method, request_rec->URI, request_rec->user_agent);
	fprintf(stderr, "%s", log);
	weblog_line(log, server->error_log, request_rec->fromhost, time(0));
	fflush(server->error_log);

}
#endif

	exit(11);	/* SIGSEGV 11 Core Segmentation Fault */
}
示例#3
0
文件: bbsweb.c 项目: wtj/formosa
/*******************************************************************
 *	檢查首頁 HTML_Announce 登入密碼正確與否
 *
 *	
 *******************************************************************/
int 
WebLoginCheck()
{
	if (strstr(skin_file->filename, HTML_Announce))
	{
		if (PSCorrect == Correct)
		{
			UpdateUserRec(request_rec->URLParaType, &curuser, NULL);
#ifdef WEB_EVENT_LOG
			weblog_line(server->access_log, "LOGIN ID=\"%s\" UA=\"%s\"",
				    curuser.userid, request_rec->user_agent);
#endif
		}
		else if (strcmp(username, "guest") && strlen(username) != 0 && PSCorrect != Correct)
			return WEB_INVALID_PASSWORD;
	}

	return WEB_OK;
}
示例#4
0
文件: signal.c 项目: foxfair/formosa
/*******************************************************************
 *	reaper - clean up zombie children
 *******************************************************************/
void
reaper(int sig)
{
	pid_t cpid;
#if	defined(SOLARIS) || defined(AIX) || defined(LINUX)
	int status;
#else
	union wait status;
#endif /* SOLARIS */

	while ((cpid = wait3(&status, WNOHANG, (struct rusage *) 0)) > 0)
	{
#ifdef PRE_FORK
		int i;
#endif
		server->child++;
#ifdef PRE_FORK
		for (i = 0; i < server->max_child; i++)
		{
			if ((server->childs)[i].pid == cpid)
			{
				(server->childs)[i].pid = 0x00;
				(server->childs)[i].status = S_ERROR;
				server->error++;
#ifdef WEB_ERROR_LOG
#if 1
				request_rec->atime = time(0);
				xstrncpy(request_rec->fromhost, "127.0.0.1", HOSTLEN);
#endif
				weblog_line(server->error_log, "ERR=\"Child unexpected return, pid=%d, status=%d (%s)\"",
				(int) cpid, (int) status, strsignal(status));
				fflush(server->error_log);
#endif
			}
		}
#endif
	}

	(void) signal(SIGCHLD, reaper);		/* 再度啟動 signal 接收 */

}
示例#5
0
文件: signal.c 项目: foxfair/formosa
void
sig_pipe(int sig)
{
	server->error++;
	server->sigpipe++;

#ifdef PRE_FORK
	(server->childs)[my_num].status = S_SIGPIPE;
#if 0
	(server->childs)[my_num].pid = 0x00;
#endif
	shutdown(0, 2);
#endif
#ifdef WEB_ERROR_LOG
	weblog_line(server->error_log, "ERR=\"%s\" REQ=\"%s %s\" UA=\"%s\"",
		    "Caught SIGPIPE", request_rec->request_method, request_rec->URI, request_rec->user_agent);
	fflush(server->error_log);
#endif
#ifdef PRE_FORK
	siglongjmp(env, 1);
#else
	_exit(13);		/* SIGPIPE 13 Exit Broken Pipe */
#endif
}
示例#6
0
文件: bbsweb.c 项目: wtj/formosa
/*******************************************************************
 *	根據 URLParaType 執行 POST 的要求
 *
 *	return HttpRespondType
 *******************************************************************/
int 
DoPostRequest(REQUEST_REC * r, BOARDHEADER * board, POST_FILE * pf)
{
	int result, URLParaType;
	char *form_data, *boardname;

	result = WEB_ERROR;
	URLParaType = r->URLParaType;
	boardname = board->filename;

	/* Get FORM data */
	if ((form_data = GetFormBody(r->content_length, WEBBBS_ERROR_MESSAGE)) == NULL)
		return WEB_ERROR;

#ifdef DEBUG
	weblog_line(server->debug_log, form_data);
	fflush(server->debug_log);
#endif

	if (PSCorrect == nLogin && URLParaType == PostSend)
	{
		/* PostSend allow username&password in form body without login */
		char pass[PASSLEN * 3];

		GetPara2(username, "Name", form_data, IDLEN, "");	/* get userdata from form */
		GetPara2(pass, "Password", form_data, PASSLEN * 3, "");
		Convert(pass, password);
		PSCorrect = CheckUserPassword(username, password);
	}

	if (URLParaType == PostSend
	    || URLParaType == TreaSend
	    || URLParaType == PostEdit
	    || URLParaType == TreaEdit
	    || URLParaType == PostForward
	    || URLParaType == TreaForward
	    || URLParaType == PostDelete
	    || URLParaType == TreaDelete
	    || URLParaType == SkinModify
	    || URLParaType == AccessListModify
		)
	{
		int perm;
		/* boardname should set in advance, now in ParseURI() */
		if (get_board(board, boardname) <= 0 || board->filename[0] == '\0')
			return WEB_BOARD_NOT_FOUND;
		if ((perm = CheckBoardPerm(board, &curuser)) != WEB_OK)
			return perm;
	}

	if (PSCorrect == Correct
	    || (PSCorrect == gLogin && (URLParaType == PostSend || URLParaType == TreaSend))
	    || URLParaType == UserNew)
	{
		int start, end;
		char path[PATHLEN];

		switch (URLParaType)
		{
			case PostSend:
			case TreaSend:
				if ((result = PostArticle(form_data, board, pf)))
				{
#if 1
					if (URLParaType == TreaSend)
					{
						if (strlen(pf->POST_NAME))
							sprintf(skin_file->filename, "/%streasure/%s/%s/$",
								BBS_SUBDIR, boardname, pf->POST_NAME);
						else
							sprintf(skin_file->filename, "/%streasure/%s/$",
								BBS_SUBDIR, boardname);
					}
					else
					{
						sprintf(skin_file->filename, "/%sboards/%s/",
						     BBS_SUBDIR, boardname);
					}
#endif

					if (PSCorrect == Correct)
						UpdateUserRec(URLParaType, &curuser, board);
				}
				break;

			case MailSend:
				if ((result = PostArticle(form_data, board, pf)))
				{
					sprintf(skin_file->filename, "/%smail/", BBS_SUBDIR);
					UpdateUserRec(URLParaType, &curuser, NULL);
				}
				break;

			case PostEdit:
			case TreaEdit:
				if ((result = EditArticle(form_data, board, pf)))
				{
					sprintf(skin_file->filename, "/%s%s.html",
						BBS_SUBDIR, pf->POST_NAME);
				}
				break;

			case PostForward:
			case TreaForward:
			case MailForward:
				if ((result = ForwardArticle(form_data, board, pf)))
				{
					find_list_range(&start, &end, pf->num, DEFAULT_PAGE_SIZE, pf->total_rec);
					setdotfile(path, pf->POST_NAME, NULL);
					sprintf(skin_file->filename, "/%s%s%d-%d",
					      BBS_SUBDIR, path, start, end);
				}
				break;

			case PostDelete:
			case TreaDelete:
			case MailDelete:
				if ((result = DeleteArticle(form_data, board, pf)))
				{
					if (URLParaType == PostDelete)
					{
						find_list_range(&start, &end, pf->num, DEFAULT_PAGE_SIZE, pf->total_rec);
						sprintf(skin_file->filename, "/%sboards/%s/%d-%d",
							BBS_SUBDIR, boardname, start, end);
					}
					else if (URLParaType == TreaDelete)
					{
						setdotfile(path, pf->POST_NAME, NULL);
						sprintf(skin_file->filename, "/%s%s",
							BBS_SUBDIR, path);
					}
					else
						/* MailDelete */
					{
						sprintf(skin_file->filename, "/%smail/", BBS_SUBDIR);
					}
				}
				break;

			case UserNew:
				if ((result = NewUser(form_data, &curuser)))
					sprintf(skin_file->filename, "%s%s%s",
						HTML_PATH, BBS_SUBDIR, HTML_UserNewOK);
				break;

			case UserIdent:
				if ((result = DoUserIdent(form_data, &curuser)))
					sprintf(skin_file->filename, "%s%s%s",
						HTML_PATH, BBS_SUBDIR, HTML_UserIdentOK);
				break;

			case UserData:
				if ((result = UpdateUserData(form_data, &curuser)))
					sprintf(skin_file->filename, "/%susers/%s",
						BBS_SUBDIR, HTML_UserData);
				break;

			case UserPlan:
				if ((result = UpdateUserPlan(form_data, &curuser)))
					sprintf(skin_file->filename, "/%susers/%s",
						BBS_SUBDIR, HTML_UserPlan);
				break;

			case UserSign:
				if ((result = UpdateUserSign(form_data, &curuser)))
					sprintf(skin_file->filename, "/%susers/%s",
						BBS_SUBDIR, HTML_UserSign);
				break;

			case UserFriend:
				if ((result = UpdateUserFriend(form_data, &curuser)))
					sprintf(skin_file->filename, "/%susers/%s",
						BBS_SUBDIR, HTML_UserFriend);
				break;

#ifdef WEB_ADMIN
			case BoardModify:	/* admin function */
				if (!HAS_PERM(PERM_SYSOP)
#ifdef NSYSUBBS
				    || !strstr(request_rec->fromhost, "140.17.12.")
#endif
					)
				{
					sprintf(WEBBBS_ERROR_MESSAGE,
					"%s 沒有權限修改看板設定", username);
					result = WEB_ERROR;
				}
				else if ((result = ModifyBoard(form_data, board)))
					sprintf(skin_file->filename, "/%sboards/%s/%s",
						BBS_SUBDIR, boardname, HTML_BoardModify);
				break;
#endif

			case SkinModify:	/* customize board skins */
				if (strcmp(username, board->owner) && !HAS_PERM(PERM_SYSOP))
				{
					sprintf(WEBBBS_ERROR_MESSAGE,
						"%s 沒有權限修改討論區介面", username);
					result = WEB_ERROR;
				}
				else if (!(board->brdtype & BRD_WEBSKIN))
				{
					sprintf(WEBBBS_ERROR_MESSAGE,
						"討論區 [%s] 尚未打開自定介面功\能", board->filename);
					result = WEB_ERROR;
				}
				else if ((result = ModifySkin(form_data, board, pf)))