¹æ¸í·Ï ¼Ò½º(visitor.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
/* ¼¹ö·ÎºÎÅÍ ³Ñ°Ü¹Þ´Â ÆÄ¶ó¹ÌÅÍÀÇ ÃÖ´ëÅ©±â Á¤ÀÇ */
#define MAX_ENTRIES 100
/* ÆÄ¶ó¹ÌÅÍÀÇ ±¸Á¶ Á¤ÀÇ */
typedef struct {
char *name; /* ÇʵåÀÇ À̸§ */
char *val; /* ÇʵåÀÇ ³»¿ë */
} entry;
/* ÇÁ·Î±×·¥¿¡¼ »ç¿ëÇÒ °¢Á¾ ÇÔ¼ö ¼±¾ð */
char *makeword(char *line, char stop);
char *fmakeword(FILE *f, char stop, int *len);
char x2c(char *what);
void unescape_url(char *url);
void plustospace(char *str);
main(int argc, int *argv[])
{
/* ÇÁ·Î±×·¥¿¡¼ »ç¿ëÇÒ °¢Á¾ º¯¼ö Á¤ÀÇ */
register int i,m;
int total, cl, cnt;
long count;
char Time[20], Date[20], fname[50], temp[10];
entry entries[MAX_ENTRIES];
time_t tmp_time1;
struct tm *tmp_time2;
FILE *fp, *rd, *wr;
if(strcmp(getenv("REQUEST_METHOD"),"POST")) {
exit(1);
}
if(strcmp(getenv("CONTENT_TYPE"), "application/x-www-form-urlencoded")) {
exit(1);
}
/* HTML ¹®¼·Î °á°ú¸¦ µ¹·ÁÁÖ±â À§ÇÑ CODEÀÌ´Ù. CGI¿Í À¥¼¹ö°£¿¡´Â */
/* »óÈ£ Åë½ÅÀ» À§ÇÑ ±Ô¾àÀÌ ÀÖ´Ù. stdoutÀ¸·Î ÀÌ ¹®ÀåÀ» ¸ÕÀú º¸³»¾ß */
/* À¥¼¹ö¸¦ ÅëÇØ HTML ¹®¼¸¦ ȸ鿡 º¸¿©ÁÙ ¼ö ÀÖ´Ù. */
/* CGI¿¡´Â ¹Ýµå½Ã µé¾î°¡´Â ¸í·ÉÀ¸·Î, µ¹·ÁÁÙ °á°ú Çü½Ä¿¡ µû¶ó */
/* Content-type µÚ¿¡´Â ¿©·¯°¡Áö Mime TypeÀÌ ¿Ã ¼ö ÀÖ´Ù. */
/* ¿©±â¼´Â HTML ¹®¼¸¦ µ¹·ÁÁØ´Ù. ÁÖÀÇÇÒ Á¡Àº µÚ¿¡ ÁÙ¹Ù²Þ Äڵ尡 */
/* µÎ °³ ¿¬´Þ¾Æ ÀÖ´Ù´Â °ÍÀÌ´Ù. */
printf("Content-type: text/html%c%c",10,10);
/* ÇöÀç ½Ã°£À» ±¸ÇØ º¯¼ö Date¿¡´Â ³¯Â¥¸¦, Time¿¡´Â ½Ã°£À» ´ã´Â´Ù */
tmp_time1 = time(0);
tmp_time2 = localtime(&tmp_time1);
strftime(Date, 99, "%Y/%m/%d", tmp_time2);
strftime(Time, 99, "%H:%M", tmp_time2);
/* ³Ñ¾î¿À´Â ÆÄ¶ó¹ÌÅÍ´Â ¸¶Áö¸·¿¡ NULL ¹®ÀÚ¸¦ °®Áö¾ÊÀ¸¹Ç·Î ȯ°æº¯¼ö */
/* CONTENT_LENGTH·ÎºÎÅÍ ÆÄ¶ó¹ÌÅÍÀÇ Àüü Å©±â¸¦ ±¸ÇÑ´Ù. */
cl = atoi(getenv("CONTENT_LENGTH"));
/* POST Method´Â stdinÀ» ÅëÇØ ÆÄ¶ó¹ÌÅͰ¡ ³Ñ¾î¿À¹Ç·Î, ÆÄ¶ó¹ÌÅ͸¦ ºÐÇØÇÏ¿© */
/* ¹Ì¸® ÁغñÇÑ ±¸Á¶Ã¼¿¡ ÀúÀåÇÑ´Ù. ¿©·¯°³ÀÇ ÆÄ¶ó¹ÌÅͰ¡ ¸ðµÎ ÇÑ ÁÙ·Î ³Ñ¾î */
/* ¿À¹Ç·Î, ÀûÀýÈ÷ »ç¿ëÇϱâ À§Çؼ´Â ÆÄ¶ó¹ÌÅ͸¦ Çʵ庰·Î ºÐÇØÇØ¾ß ÇÑ´Ù. */
/* ÆÄ¶ó¹ÌÅÍ´Â field_name1=value1&field_name2=value2...¿Í °°Àº ±¸Á¶·Î */
/* ³Ñ¾î¿Â´Ù. Áï, Çʵå¸í°ú °ªÀº =·Î ±¸ºÐµÇ°í, °¢ Çʵå´Â &·Î ±¸º°µÈ´Ù. */
/* °ª ¾È¿¡ °ø¹é(Space)ÀÌ µé¾îÀÖÀ» °æ¿ì ÀÌ´Â +·Î ġȯµÈ´Ù. */
/* ¶Ç =, &, +µî Ưº°ÇÑ Àǹ̸¦ °®´Â ¹®ÀÚ´Â Äڵ尪À¸·Î ¹Ù²î¾î ³Ñ¾î¿À°ÔµÈ´Ù */
/* ÀÌ·¯ÇÑ ÆÄ¶ó¹ÌÅ͸¦ ´Ù½Ã º¯ÇüÇϰí Á¶ÀÛÇØ¼ »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ °Í°ú µ¿ÀÏÇÑ */
/* °ªÀ» ¾ò¾î³»¾ßÇÑ´Ù. */
for(i=0;cl && (!feof(stdin));i++)
{
m = i;
/* fmakeword´Â util.c¿¡ ¸¸µé¾îÁ®ÀÖ´Â ÇÔ¼öÀ̸ç */
/* ÇÑ ÁÙ·Î µÇ¾îÀÖ´Â °¢°¢ÀÇ ÆÄ¶ó¹ÌÅ͸¦ ³ª´©¾îÁØ´Ù */
entries[i].val = (char *)fmakeword(stdin,'&',&cl);
/* plustospace ¿ª½Ã util.c¿¡ Á¤ÀǵǾî ÀÖÀ¸¸ç, */
/* ÆÄ¶ó¹ÌÅÍ °ª ³»ºÎÀÇ +¸¦ ´Ù½Ã °ø¹éÀ¸·Î ¹Ù²Ù¾îÁØ´Ù */
plustospace(entries[i].val);
/* unescape_url ÇÔ¼ö´Â ÆÄ¶ó¹ÌÅÍ ³»¿¡ Äڵ尪À¸·Î */
/* µé¾îÀִ Ư¼öÇÑ ¹®ÀÚµéÀ» ´Ù½Ã ¿ø·¡´ë·Î º¹±¸ÇØÁØ´Ù */
unescape_url(entries[i].val);
/* makeword´Â ÆÄ¶ó¹ÌÅÍ ³»¿¡¼ Çʵå¸íÀ» ºÐ¸®Çس½´Ù */
/* ±¸Á¶Ã¼ÀÇ val¿¡´Â °ª¸¸ ³²´Â´Ù. */
entries[i].name = (char *)makeword(entries[i].val,'=');
}
/* À§ÀÇ for¹®Àº Method°¡ POSTÀÎ ÆÄ¶ó¹ÌÅ͸¦ ³Ñ°Ü¹Þ´Â CGI¶ó¸é °ÅÀÇ */
/* ¸ðµÎ ¶È°°ÀÌ ¾²À̸ç, À¥¼¹ö·ÎºÎÅÍ ÆÄ¶ó¹ÌÅ͸¦ ÆÐ½º¹Þ´Â ÇÙ½ÉÀûÀÎ */
/* ºÎºÐÀÌ µÈ´Ù. ÇÔ¼öÀÇ ³»ºÎ°¡ ±Ã±ÝÇϸé util.c¸¦ º¸±â¹Ù¶õ´Ù. */
/* ¹æ¸í·ÏÀÌ ±â·ÏµÉ ÈÀÏÀ» ¾²±â °¡´ÉÇÑ ¸ðµå·Î ¿¬´Ù */
fp = fopen("/www/www_home/online/visitor.html", "a+");
/* ÃÖ¼ÒÇÑ À̸§Àº ±â·ÏÇØ¾ß ¹æ¸í·Ï¿¡ ³²À¸¹Ç·Î, À̸§À» ¾²Áö¾ÊÀº */
/* °æ¿ì¿¡´Â ±â·ÏÇÏÁö¾Ê°í ¸Þ½ÃÁö¸¦ »Ñ·ÁÁÖ¸ç Á¾·á */
if(strlen(entries[0].val) <= 0)
{
/* °á°ú´Â HTML ¹®¼·Î µ¹·ÁÁø´Ù. À̸¦ À§Çؼ´Â */
/* stdoutÀ¸·Î HTML ¹®¹ý¿¡ ¸ÂÃß¾î Ãâ·ÂÇÏ¸é µÈ´Ù */
printf("<BODY BGCOLOR=\"#aa9966\" TEXT=\"#f40000\" LINK=\"#FFFF66\" ");
printf("VLINK=\"#000099\" ALINK=\"#FFFFFF\">%c", 10);
printf("<H2>Sorry</H2>%c", 10);
printf("You should write your name.<BR>%c", 10);
printf("Back to <A HREF=\"http://dblab.changwon.ac.kr/openbook/makehome/\">
previous page</A> and try again please.%c", 10);
printf("</BODY>");
fclose(fp);
exit(0);
}
/* ¹æ¹®ÀÚ°¡ ÀÚ½ÅÀÇ È¨ÆäÀÌÁö URLÀ» ½èÀ¸¸é, À̸¦ À̸§¿¡ ¸µÅ©½ÃŲ´Ù. */
if((strlen(entries[2].val) > 0) && strcmp(entries[2].val, "http://"))
fprintf(fp, "<A HREF=\"%s\">", entries[2].val);
/* À̸§À» ±â·ÏÇÑ´Ù */
fprintf(fp, "<STRONG>%s</STRONG>", entries[0].val);
/* ȨÆäÀÌÁö ¸µÅ©¸¦ ´Ý´Â´Ù */
if((strlen(entries[2].val) > 0) && strcmp(entries[2].val, "http://"))
fprintf(fp, "</A>");
fprintf(fp, ";");
/* ¹æ¹®ÀÚ°¡ ÀÚ½ÅÀÇ E-Mail Address¸¦ ±â·ÏÇßÀ¸¸é À̸¦ ¸µÅ©ÇÑ´Ù. */
if((strlen(entries[1].val) > 0) && strcmp(entries[1].val, "user@hostdomain"))
fprintf(fp, "<A HREF=\"mailto:%s\"><EM>%s</EM></A<", entries[1].val, entries[1].val);
else
fprintf(fp, "<CENTER>¾øÀ½</CENTER>");
fprintf(fp, ";");
/* ¹æ¹®ÇÑ ³¯Â¥¸¦ ±â·ÏÇÑ´Ù. */
fprintf(fp, "%s;", Date);
/* ¹æ¹®ÇÑ ½Ã°£À» ±â·ÏÇÑ´Ù */
fprintf(fp, "%s;", Time);
/* Comment¸¦ ÀÔ·ÂÇÑ °æ¿ì À̸¦ ±â·ÏÇÑ´Ù */
if(strlen(entries[3].val) > 0) {
/* countÈÀÏ¿¡¼ count¸¦ Àоî¿Â´Ù */
rd = fopen("/www/cgi-bin/text/count", "r");
fgets(temp, 8, rd);
fclose(rd);
strcpy(fname, "/www/www_home/online/");
strcat(fname, temp);
wr = fopen(fname,"w+");
fprintf(wr, "<HTML>%c",10);
fprintf(wr, "<BODY BACKGROUND=\"/background/back116.jpg\">%c",10);
fprintf(wr, "<ul><pre>%s %c", entries[3].val, 10);
fprintf(wr, "</ul></pre></BODY>%c",10);
fprintf(wr, "</HTML>%c",10);
fclose(wr);
sscanf(temp,"%d",&cnt);
wr = fopen("/www/cgi-bin/text/count","w");
fprintf(fp, "<A HREF=\"/online/%d\"><IMG SRC=\"/icons/newspap.gif\" border=0></A>",
cnt, entries[3].val);
cnt++;
fprintf(wr,"%d",cnt);
fclose(wr);
}
fprintf(fp, ";\n");
/* ¹æ¸í·Ï ÈÀÏÀ» ´Ý´Â´Ù */
fclose(fp);
/* ȸ鿡 ±â·ÏÀÌ ¿Ï·áµÇ¾ú´Ù´Â ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù */
printf("<BODY BGCOLOR=\"#CC9966\" TEXT=\"#440000\" ");
printf("LINK=\"#FFFF66\" VLINK=\"#000099\" ALINK=\"#FFFFFF\">%c", 10);
printf("<FONT SIZE=3><CITE>Thank you.</CITE></FONT><P>%c", 10);
printf("Your signature added to <A HREF=\"http://sarim.changwon.ac.kr/htbin/scr_visit\">
my guestbook</A><BR>%c", 10);
printf("Back to <A HREF=\"http://dblab.changwon.ac.kr/openbook/makehome/\">Home</A>%c", 10);
printf("</BODY>");
}