Annotation of capa/capa51/pProj/capaNewCgi.c, revision 1.1

1.1     ! albertel    1: char *makeword(char *line, char stop)
        !             2: {
        !             3:     int x = 0,y;
        !             4:     char *word = (char *) malloc(sizeof(char) * (strlen(line) + 1));
        !             5: 
        !             6:     for(x=0;((line[x]) && (line[x] != stop));x++)
        !             7:         word[x] = line[x];
        !             8: 
        !             9:     word[x] = '\0';
        !            10:     if(line[x]) ++x;
        !            11:    y=0;
        !            12: 
        !            13:     while((line[y++] = line[x++]));
        !            14:     return word;
        !            15: }
        !            16: 
        !            17: char *fmakeword(FILE *f,char  stop,int * cl)
        !            18: {
        !            19:     int wsize;
        !            20:     char *word;
        !            21:     int ll;
        !            22: 
        !            23:     wsize = 102400;
        !            24:     ll=0;
        !            25:     word = (char *) malloc(sizeof(char) * (wsize + 1));
        !            26: 
        !            27:     while(1) {
        !            28:         word[ll] = (char)fgetc(f);
        !            29:         if(ll==wsize) {
        !            30:             word[ll+1] = '\0';
        !            31:             wsize+=102400;
        !            32:             word = (char *)realloc(word,sizeof(char)*(wsize+1));
        !            33:         }
        !            34:         --(*cl);
        !            35:         if((word[ll] == stop) || (feof(f)) || (!(*cl))) {
        !            36:             if(word[ll] != stop) ll++;
        !            37:             word[ll] = '\0';
        !            38:             return word;
        !            39:         }
        !            40:         ++ll;
        !            41:     }
        !            42: }
        !            43: 
        !            44: char x2c(char *what)
        !            45: {
        !            46:     register char digit;
        !            47: 
        !            48:     digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0'));
        !            49:     digit *= 16;
        !            50:     digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A')+10 : (what[1] - '0'));
        !            51:     return(digit);
        !            52: }
        !            53: 
        !            54: void unescape_url(char *url)
        !            55: {
        !            56:     register int x,y;
        !            57: 
        !            58:     for(x=0,y=0;url[y];++x,++y) {
        !            59:         if((url[x] = url[y]) == '%') {
        !            60:             url[x] = x2c(&url[y+1]);
        !            61:             y+=2;
        !            62:         }
        !            63:     }
        !            64:     url[x] = '\0';
        !            65: }
        !            66: 
        !            67: void plustospace(char *str)
        !            68: {
        !            69:     register int x;
        !            70: 
        !            71:     for(x=0;str[x];x++) if(str[x] == '+') str[x] = ' ';
        !            72: }
        !            73: 
        !            74: void web_parse_input(char * submissions_str)
        !            75: {
        !            76:   int x;
        !            77: 
        !            78:   for(x=0; x <= m; x++) {
        !            79:     if( !strcmp(g_entries[x].name,"CLASS") ) {
        !            80:       strncpy(g_class_name,g_entries[x].val,MAX_CLASS_CHAR);
        !            81:     }
        !            82:     if( !strcmp(g_entries[x].name,"M") ) {
        !            83:       sscanf(g_entries[x].val,"%d",&g_run_mode);
        !            84:     }
        !            85:     if( !strcmp(g_entries[x].name,"SNUM") ) {
        !            86:       strncpy(g_student_number,g_entries[x].val,MAX_STUDENT_NUMBER+4);
        !            87:     }
        !            88:     if( !strcmp(g_entries[x].name,"CAPAID") ) {
        !            89:       sscanf(g_entries[x].val,"%d",&g_entered_pin);
        !            90:     }
        !            91:     if( !strcmp(g_entries[x].name,"SET") ) {
        !            92:       sscanf(g_entries[x].val,"%d",&g_set);
        !            93:     }
        !            94:     if( !strcmp(g_entries[x].name,"VSET") ) {
        !            95:       if (g_entries[x].val[0] == '\0') {
        !            96: 	g_vset=0;
        !            97:       } else {
        !            98: 	sscanf(g_entries[x].val,"%d",&g_vset);
        !            99:       }
        !           100:     }
        !           101:     if( !strcmp(g_entries[x].name,"KND") ) {
        !           102:       sscanf(g_entries[x].val,"%d",&g_skind);
        !           103:     }
        !           104:     if( !strncmp(g_entries[x].name,"INPUT",5) ) {
        !           105:       sscanf(g_entries[x].name,"INPUT%d",&q_idx);
        !           106:       if( q_idx > 0 && q_idx < MAX_PROBLEM_CNT ) {
        !           107: 	strncpy(g_student_answer[q_idx],g_entries[x].val,MAX_ANSWER_CHAR);
        !           108:       }
        !           109:       if ( g_student_answer[q_idx][0] != '\0' ) {
        !           110: 	sprintf(buf,"%d\t%s\t",q_idx,g_student_answer[q_idx]);
        !           111: 	strcat(submissions_str,buf);
        !           112:       }
        !           113:     }
        !           114:     if( !strncmp(g_entries[x].name,"LAST",4) ) {
        !           115:       sscanf(g_entries[x].name,"LAST%d",&q_idx);
        !           116:       if( q_idx > 0 && q_idx < MAX_PROBLEM_CNT ) {
        !           117: 	strncpy(g_last_answer[q_idx],g_entries[x].val,MAX_ANSWER_CHAR);
        !           118:       }
        !           119:     }
        !           120:     free(g_entries[x].val);
        !           121:     free(g_entries[x].name);
        !           122:   }
        !           123: }
        !           124: 
        !           125: int web_login() 
        !           126: {
        !           127:   if( g_entered_pin != 0 ) {
        !           128:     g_login_set = capa_PIN(g_student_number,999,g_entered_pin);
        !           129:   } else {
        !           130:     return WEB_ERR_ENTERED_PIN;
        !           131:   }
        !           132: 
        !           133:   if (!g_login_set) { 
        !           134:     return WEB_ERR_BADLOGIN;
        !           135:   } else {
        !           136:     if ( g_login_set > 99 )  { return WEB_ERR_LOGINTOHIGH; }
        !           137:     if(g_login_set < g_vset ) {
        !           138:       return WEB_ERR_NOTVIEWABLE;
        !           139:     }
        !           140:     chdir(g_class_fullpath);  /* again, to make sure */
        !           141:       
        !           142:     if ( capa_get_student(g_student_number,&g_student_data) == 0 ) {
        !           143:       return WEB_ERR_STUDENT_NOT_EXIST;
        !           144:     } else {
        !           145:       time(&curtime);
        !           146:       if (capa_get_header(&header, g_login_set, wgt, pcr))  {
        !           147: 	return WEB_ERR_SET_NOT_READY;
        !           148:       }
        !           149:       if(capa_check_date(CHECK_OPEN_DATE,g_student_data.s_sec,
        !           150: 			 g_login_set) < 0 ) {
        !           151: 	
        !           152: 	return WEB_ERR_SET_NOT_OPEN;
        !           153:       }
        !           154:     }
        !           155:   }
        !           156:   return (error);
        !           157: }
        !           158: 
        !           159: int web_get_input() 
        !           160: {
        !           161:   
        !           162:   envPtr=getenv("REQUEST_METHOD");
        !           163:   if (!envPtr ) { return WEB_ERR_REQ_METHOD; }
        !           164:   if (strcmp(envPtr,"POST")) { return WEB_ERR_ENV_POST; }
        !           165:   envPtr=getenv("CONTENT_TYPE");
        !           166:   if (!envPtr ) { return WEB_ERR_CONTENT_TYPE; }
        !           167:   if (strcmp(envPtr,"application/x-www-form-urlencoded")) { 
        !           168:     return WEB_ERR_ENV_CONTENT; 
        !           169:   }
        !           170:   envPtr=getenv("CONTENT_LENGTH");
        !           171:   if (!envPtr ) { return WEB_ERR_CONTENT_LENGTH; }
        !           172:   content_length=atoi(envPtr);
        !           173: 
        !           174:   /* read the form into the g_entries array*/
        !           175:   for(x=0;content_length && (!feof(stdin));x++) {
        !           176:     m=x;
        !           177:     g_entries[x].val = fmakeword(stdin,'&',&content_length);
        !           178:     plustospace(g_entries[x].val);
        !           179:     unescape_url(g_entries[x].val);
        !           180:     g_entries[x].name = makeword(g_entries[x].val,'=');
        !           181:   }
        !           182: 
        !           183:   web_parse_input(submissions_str);
        !           184: 
        !           185:   if ( g_run_mode == WEB_CHECKIN ) {
        !           186:     time(&curtime); time_str = ctime(&curtime);
        !           187:     time_str[ strlen(time_str)-1 ] = '\0';
        !           188:     envPtr=getenv("REMOTE_HOST");
        !           189:     envPtr2=getenv("HTTP_USER_AGENT");
        !           190:     sprintf(log_str,"%s\t%s\t%s\t%s\t%s\n",g_class_name,g_student_number,
        !           191: 	    time_str,envPtr,envPtr2);
        !           192:     if (web_log(log_str) == -1 ) { return WEB_ERR_WEB_LOG; }
        !           193:   }
        !           194: 
        !           195:   getwd(g_cwd);
        !           196: 
        !           197:   web_getclassdir(&g_cpath, &g_cowner, g_class_name);
        !           198:   sprintf(g_class_fullpath,"%s/%s",g_cpath,g_class_name);
        !           199:   if( !capa_access(g_class_fullpath, F_OK) == 0 ) { return WEB_ERR_ACCESS; }
        !           200:     
        !           201:   chdir(g_class_fullpath);
        !           202:   if ( g_run_mode == M_CHECKANS) {
        !           203:     if (w_log_submissions(g_student_number,g_set,submissions_str) == -1 ) {
        !           204:       return WEB_ERR_SUBMMISIONS_LOG;    
        !           205:     }
        !           206:   }
        !           207:   
        !           208:   result=read_capa_config("capaweb_cgibin_path",buf);
        !           209:   if (result != 0 && result != -1) {
        !           210:     g_cgibin_path=capa_malloc(strlen(buf)+1,1);
        !           211:     strcpy(g_cgibin_path,buf);
        !           212:   } else {
        !           213:     g_cgibin_path=capa_malloc(strlen("capa-bin")+1,1);
        !           214:     strcpy(g_cgibin_path,"capa-bin");
        !           215:   }  
        !           216:   return web_login();
        !           217: }
        !           218: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>