#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>"); }