#include #include #include #include #include "global.h" #include "manhat-lib/shared_util.h" #include "manhat-lib/shared_cs_util.h" #include "manhat-lib/shared_news_util.h" #include "manhat-lib/shared_lock.h" #define NOTEAM '!' static void read_parameters (char *course, char *key, int *grp, int *hide, long *offset) { char msg[50]; /* scratch string */ cs_get_required_parameter ("crs", course, MAX_PATH); /* shared_cgi_util.c */ cs_get_required_parameter ("id", key, MAX_KEY); cs_get_required_parameter ("hide", msg, 5); *hide = atoi (msg); cs_get_required_parameter ("loc", msg, 40); *offset = atol (msg); cs_get_required_parameter ("grp", msg, 5); *grp = atoi (msg); } void hide_unhide_msg(SESSION *user, int grp, long offset, int hide, CONFIG_STRUCT *conf, char *sender_team, int *msg_id) { int fd; FILE *fp; char inbox_fname[MAX_PATH + 1]; /* full path to central inbox */ CENTRAL_INBOX_RECORD data; set_discussion_names (conf->course_path, user->username, grp); /* shared_news_util.c */ snprintf(inbox_fname,MAX_PATH + 1,"%s%s",central_discussion_path,INBOX_FNAME); fp = fopen(inbox_fname,"r+"); if(!fp) /* inbox.dat doesn't exist */ cs_critical_error(ERR_FOPEN_READ_FAILED, inbox_fname); fd = fileno(fp); get_exclusive_lock(fd, 1); /* shared_lock.c */ if( fseek( fp, offset, SEEK_SET) ) cs_critical_error(ERR_FSEEK_FAILED, inbox_fname); if(fread(&data,sizeof(CENTRAL_INBOX_RECORD),1,fp) != 1) cs_critical_error(ERR_FREAD_FAILED, inbox_fname); /* return msg_id to calling program */ *msg_id = data.info.msg_id; if(hide == 1) SET_BASIC_STATUS(data.status, TEACHER_HIDDEN) else if (hide == 2) SET_BASIC_STATUS(data.status, READ_ONLY) else SET_BASIC_STATUS(data.status, NORMAL) data.release_time = 0; data.unrelease_time = 0; if( fseek( fp, offset, SEEK_SET) ) cs_critical_error(ERR_FSEEK_FAILED, inbox_fname); if(fwrite(&data,sizeof(CENTRAL_INBOX_RECORD),1,fp) != 1) cs_critical_error(ERR_FWRITE_FAILED, inbox_fname); release_lock(fd); /* shared_lock.c */ fclose(fp); if(grp == TEAM_TEACH) *sender_team = data.info.sender_team; else *sender_team = NOTEAM; } int main (void) { SESSION user; CONFIG_STRUCT conf; /* the configuration read from config file */ char course[MAX_PATH + 1]; /* from crs=? command line */ char key[MAX_KEY + 1]; /* from id=? command line */ int grp; /* from grp=? command line */ int hide; /* from hide=? command line - hide or unhide the msg? */ long offset; /* from loc=? command line */ char team; int msg_id; cs_cgi_init(); read_parameters (course, key, &grp, &hide, &offset); read_configuration_file (course, &conf); /* shared_util.c */ validate_key (key, &user, &conf); /* shared_util.c */ if(user.group != FACULTY) cs_critical_error(ERR_REQUEST_DENIED, ""); hide_unhide_msg(&user, grp, offset,hide, &conf, &team, &msg_id); if(team == NOTEAM) printf ("Location: %s?crs=%s&id=%s&grp=%d#%d\n\n", "news_manage_topic_list", course, key,grp,msg_id); else printf ("Location: %s?crs=%s&id=%s&grp=%d&team=%c#%d\n\n", "news_manage_topic_list", course, key,grp,team,msg_id); cs_cgi_destroy(); return 0; }