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>