summaryrefslogblamecommitdiffstats
path: root/mbbsd/voteboard.c
blob: d2d568c57d9f4ffbdb97adb8df106e3fad3af2e9 (plain) (tree)
1
2
3
4
5
6
7
8
9
          
                


                            
    

                                      
                                
                                  



                                 
                           
                             
                                     
                       
                              
 

            
                           
                    
                                                   

                      
     



                                  
 

                                     
 

                              
 










                                                  
                                                                       
                                      
                        

                                             
                                                           
                              
                           


                       


                               
                                                        
                        

                                                                                  
                                   
                           

                       
                                             
                  

         
               
        
                                                                                     

                   
                                                   

                                                                                                        
                                                          
               
     













                                               
 

                                               
                  
                                  
     

                                 
                                                                          


                                 
                                


                                                    
                                                                                                 
                     
                                                 
       
                         
                                                                                                     



                                                   
                  
                                                                                                 
                     
                                                

                         




                                                                                                    
 
                       
              

               



                            
   
                      






                                 
                         

            
                           
                    
                                                   

                          
     

               


                                               
               
               
                                               
               
                                                 

        
                                                                            
                           
                                                       
                   

                           
           
                                                                                  
                              
                                                                                           
                                        

                                                                                                                

              
                                                                                  
                              
                                                                                           
                                        

                                                                                                                

              
            
                                                                                             

                                            
                                                         
                                        
                                                         

                      
                           
                                                                                  
                                        
                                                                                                                                                      
 
                                                                                  

                              

                                                                                  
                              
                              

                                                                                         
                              
                                                           
              
           
                              
                                                               




                                                     
                                                                                  
                                        

                                                                                                                
              
           
                              
                                                               




                                                     


                                                                                                                                                                                              
              
           
                              
                                                               




                                                     
                                                                                  
                                        

                                                                                                          
                            
            
                                                                                             
                                  
                                                           
                              
                                                           
              
           
                                                                                  
                              
                                                                                  
                                        


                                                                                                            
              
           
                                                                                  
                              
                                                                                  
                                                          

                                                                                                                                    

                              
                                                           
              
           
                                                                                  
                              
                                                                                  
                                                            

                                                                                                                                                  



                          
                                             
                                        
                                                                                         



                                  
                   
                              
                                                       
                             
                                                 

                                
                             


                                                       

                                

                                    
                                                 

                          



                                                                                          

                                
                                                                  
                                                           
                                   
                               
                                                                 



                                 
/* $Id$ */
#include "bbs.h"

#define VOTEBOARD "NewBoard"

void
do_voteboardreply(fileheader_t * fhdr)
{
    char            genbuf[256];
    char            reason[36]="";
    char            fpath[80];
    char            oldfpath[80];
    char            opnion[10];
    char           *ptr;
    FILE           *fo,*fi;
    fileheader_t    votefile;
    int             yes=0, no=0, len;
    int             fd;
    time_t          endtime=0;


    clear();
    if (!CheckPostPerm()) {
    move(5, 10);
    prints(SHM->i18nstr[cuser.language][2457]);
    pressanykey();
    return;
    }
    setbpath(fpath, currboard);
    stampfile(fpath, &votefile);

    setbpath(oldfpath, currboard);

    strcat(oldfpath, "/");
    strcat(oldfpath, fhdr->filename);

    fi = fopen(oldfpath, "r");
    assert(fi);

    while (fgets(genbuf, sizeof(genbuf), fi)) {

        if (yes>=0)
           {
            if (!strncmp(genbuf, "----------",10))
               {yes=-1; continue;}
            else 
                yes++;
           }
        if (yes>3) prints(genbuf);

    if (!strncmp(genbuf, SHM->i18nstr[cuser.language][2458], 12)) {
        ptr = strchr(genbuf, '(');
        assert(ptr);
        sscanf(ptr + 1, "%ld", &endtime);
        if (endtime < now) {
        prints(SHM->i18nstr[cuser.language][2459]);
        pressanykey();
        fclose(fi);
        return;
        }
    }
        if(yes>=0) continue; 

        strtok(genbuf+4," \n");
    if (!strncmp(genbuf + 4, cuser.userid, IDLEN)) {
        move(5, 10);
        prints(SHM->i18nstr[cuser.language][2460]);
        getdata(17, 0, SHM->i18nstr[cuser.language][2461], opnion, 3, LCECHO);
        if (opnion[0] != 'y') {
        fclose(fi);
        return;
        }
        strlcpy(reason, genbuf + 19, 34);
            break;
    }
    }
    fclose(fi);
    do {
    if (!getdata(19, 0, SHM->i18nstr[cuser.language][2462], opnion, 3, LCECHO)) {
        return;
    }
    } while (opnion[0] != 'y' && opnion[0] != 'n');
    sprintf(genbuf, SHM->i18nstr[cuser.language][2463],
        opnion[0] == 'y' ? SHM->i18nstr[cuser.language][2464] : SHM->i18nstr[cuser.language][2465]);
    if (!getdata_buf(20, 0, genbuf, reason, 35, DOECHO)) {
    return;
    }
    if ((fd = open(oldfpath, O_RDONLY)) == -1)
    return;
    if(flock(fd, LOCK_EX)==-1 )
       {close(fd); return;}
    if(!(fi = fopen(oldfpath, "r")))
       {flock(fd, LOCK_UN); close(fd); return;}
     
    if(!(fo = fopen(fpath, "w")))
       {
        flock(fd, LOCK_UN);
        close(fd);
        fclose(fi);
    return;
       }

    while (fgets(genbuf, sizeof(genbuf), fi)) {
        if (!strncmp("----------", genbuf, 10))
        break;
    fprintf(fo, "%s", genbuf);
    }
    if (!endtime) {
    now += 14 * 24 * 60 * 60;
    fprintf(fo, SHM->i18nstr[cuser.language][2466], now, ctime(&now));
    now -= 14 * 24 * 60 * 60;
    }
    fprintf(fo, "%s", genbuf);
    len = strlen(cuser.userid); 
    for(yes=0; fgets(genbuf, sizeof(genbuf), fi);) {
    if (!strncmp("----------", genbuf, 10))
        break;
    if (strlen(genbuf)<30 || (genbuf[4+len]==' ' && !strncmp(genbuf + 4, cuser.userid, len)))
            continue;
    fprintf(fo, "%3d.%s", ++yes, genbuf + 4);
      }
    if (opnion[0] == 'y')
    fprintf(fo, SHM->i18nstr[cuser.language][2467], ++yes, cuser.userid, reason, cuser.lasthost);
    fprintf(fo, "%s", genbuf);

    for(no=0; fgets(genbuf, sizeof(genbuf), fi);) {
    if (!strncmp("----------", genbuf, 10))
        break;
    if (strlen(genbuf)<30 || (genbuf[4+len]==' ' && !strncmp(genbuf + 4, cuser.userid, len)))
            continue;
    fprintf(fo, "%3d.%s", ++no, genbuf + 4);
    }
    if (opnion[0] == 'n')
    fprintf(fo, SHM->i18nstr[cuser.language][2468], ++no, cuser.userid, reason, cuser.lasthost);
    fprintf(fo, SHM->i18nstr[cuser.language][2469]);
    fprintf(fo, SHM->i18nstr[cuser.language][2470], yes, no);
    fprintf(fo, "%s"BBSNAME"("MYHOSTNAME"%s", SHM->i18nstr[cuser.language][2471],
                SHM->i18nstr[cuser.language][2472]);

    flock(fd, LOCK_UN);
    close(fd);
    fclose(fi);
    fclose(fo);
    unlink(oldfpath);
    rename(fpath, oldfpath);
}

int
do_voteboard(int type)
{
    fileheader_t    votefile;
    char            topic[100];
    char            title[80];
    char            genbuf[1024];
    char            fpath[80];
    FILE           *fp;
    int             temp;

    clear();
    if (!CheckPostPerm()) {
    move(5, 10);
    prints(SHM->i18nstr[cuser.language][2473]);
    pressanykey();
    return FULLUPDATE;
    }
    move(0, 0);
    clrtobot();
    prints(SHM->i18nstr[cuser.language][2474]);
    prints(SHM->i18nstr[cuser.language][2475]);
    prints(SHM->i18nstr[cuser.language][2476]);
    move(4, 0);
    clrtobot();
    prints(SHM->i18nstr[cuser.language][2477]);
    if(type==0)
      prints(SHM->i18nstr[cuser.language][2478]);

    do {
    getdata(6, 0, SHM->i18nstr[cuser.language][2479], topic, 3, DOECHO);
    temp = atoi(topic);
    } while (temp < 0 || temp > 9 || (type && temp>2));
    switch (temp) {
    case 0:
         return FULLUPDATE;
    case 1:
    if (!getdata(7, 0, SHM->i18nstr[cuser.language][2480], topic, 30, DOECHO))
        return FULLUPDATE;
    snprintf(title, sizeof(title), "%s %s", SHM->i18nstr[cuser.language][2481], topic);
    snprintf(genbuf, sizeof(genbuf),
         "%s\n\n%s%s\n", SHM->i18nstr[cuser.language][2482], SHM->i18nstr[cuser.language][2483], topic);
    strcat(genbuf, SHM->i18nstr[cuser.language][2484]);
    break;
    case 2:
    if (!getdata(7, 0, SHM->i18nstr[cuser.language][2485], topic, 30, DOECHO))
        return FULLUPDATE;
    snprintf(title, sizeof(title), "%s %s", SHM->i18nstr[cuser.language][2486], topic);
    snprintf(genbuf, sizeof(genbuf),
         "%s\n\n%s%s\n", SHM->i18nstr[cuser.language][2487], SHM->i18nstr[cuser.language][2488], topic);
    strcat(genbuf, SHM->i18nstr[cuser.language][2489]);
    break;
    case 3:
    do {
        if (!getdata(7, 0, SHM->i18nstr[cuser.language][2490], topic, IDLEN + 1, DOECHO))
        return FULLUPDATE;
        else if (invalid_brdname(topic))
        outs(SHM->i18nstr[cuser.language][2491]);
        else if (getbnum(topic) > 0)
        outs(SHM->i18nstr[cuser.language][2492]);
        else
        break;
    } while (temp > 0);
    snprintf(title, sizeof(title), SHM->i18nstr[cuser.language][2493], topic);
    snprintf(genbuf, sizeof(genbuf),
         "%s\n\n%s%s\n%s", SHM->i18nstr[cuser.language][2494], SHM->i18nstr[cuser.language][2495], topic, SHM->i18nstr[cuser.language][2496]);

    if (!getdata(8, 0, SHM->i18nstr[cuser.language][2497], topic, 20, DOECHO))
        return FULLUPDATE;
    strcat(genbuf, topic);
    strcat(genbuf, SHM->i18nstr[cuser.language][2498]);
    if (!getdata(9, 0, SHM->i18nstr[cuser.language][2499], topic, 20, DOECHO))
        return FULLUPDATE;
    strcat(genbuf, topic);
    strcat(genbuf, SHM->i18nstr[cuser.language][2500]);
    getdata(10, 0, SHM->i18nstr[cuser.language][2501], topic, IDLEN * 3 + 3, DOECHO);
    strcat(genbuf, topic);
    strcat(genbuf, SHM->i18nstr[cuser.language][2502]);
    break;
    case 4:
        move(1,0); clrtobot();
        generalnamecomplete(SHM->i18nstr[cuser.language][2503],
                            topic, IDLEN+1,
                            SHM->Bnumber,
                            completeboard_compar,
                            completeboard_permission,
                            completeboard_getname);
    snprintf(title, sizeof(title), SHM->i18nstr[cuser.language][2504], topic);
    snprintf(genbuf, sizeof(genbuf),
         "%s\n\n%s%s\n", SHM->i18nstr[cuser.language][2505], SHM->i18nstr[cuser.language][2506], topic);
    strcat(genbuf, SHM->i18nstr[cuser.language][2507]);
    break;
    case 5:
        move(1,0); clrtobot();
        generalnamecomplete(SHM->i18nstr[cuser.language][2508],
                            topic, IDLEN+1,
                            SHM->Bnumber,
                            completeboard_compar,
                            completeboard_permission,
                            completeboard_getname);
    snprintf(title, sizeof(title), SHM->i18nstr[cuser.language][2509], topic);
    snprintf(genbuf, sizeof(genbuf), "%s\n\n%s%s\n%s%s", SHM->i18nstr[cuser.language][2510], SHM->i18nstr[cuser.language][2511], topic, SHM->i18nstr[cuser.language][2512], cuser.userid);
    strcat(genbuf, SHM->i18nstr[cuser.language][2513]);
    break;
    case 6:
        move(1,0); clrtobot();
        generalnamecomplete(SHM->i18nstr[cuser.language][2514],
                            topic, IDLEN+1,
                            SHM->Bnumber,
                            completeboard_compar,
                            completeboard_permission,
                            completeboard_getname);
    snprintf(title, sizeof(title), SHM->i18nstr[cuser.language][2515], topic);
    snprintf(genbuf, sizeof(genbuf),
         "%s\n\n%s%s\n%s", SHM->i18nstr[cuser.language][2516], SHM->i18nstr[cuser.language][2517],
         topic, SHM->i18nstr[cuser.language][2518]);
        temp=getbnum(topic);
    do {
        if (!getdata(7, 0, SHM->i18nstr[cuser.language][2519], topic, IDLEN + 1, DOECHO))
        return FULLUPDATE;
        }while (!userid_is_BM(topic, bcache[temp - 1].BM));
    strcat(genbuf, topic);
    strcat(genbuf, SHM->i18nstr[cuser.language][2520]);
    break;
    case 7:
    if (!getdata(7, 0, SHM->i18nstr[cuser.language][2521], topic, 30, DOECHO))
        return FULLUPDATE;
    snprintf(title, sizeof(title), SHM->i18nstr[cuser.language][2522], topic);
    snprintf(genbuf, sizeof(genbuf),
         "%s\n\n%s%s\n%s%s", SHM->i18nstr[cuser.language][2523], SHM->i18nstr[cuser.language][2524],
         topic, SHM->i18nstr[cuser.language][2525], cuser.userid);
    strcat(genbuf, SHM->i18nstr[cuser.language][2526]);
    break;
    case 8:
    if (!getdata(7, 0, SHM->i18nstr[cuser.language][2527], topic, 30, DOECHO))
        return FULLUPDATE;
    snprintf(title, sizeof(title), SHM->i18nstr[cuser.language][2528], topic);
    snprintf(genbuf, sizeof(genbuf), "%s\n\n%s%s\n%s",
         SHM->i18nstr[cuser.language][2529], SHM->i18nstr[cuser.language][2530], topic, SHM->i18nstr[cuser.language][2531]);
    if (!getdata(8, 0, SHM->i18nstr[cuser.language][2532], topic, IDLEN + 1, DOECHO))
        return FULLUPDATE;
    strcat(genbuf, topic);
    strcat(genbuf, SHM->i18nstr[cuser.language][2533]);
    break;
    case 9:
    if (!getdata(7, 0, SHM->i18nstr[cuser.language][2534], topic, 30, DOECHO))
        return FULLUPDATE;
    snprintf(title, sizeof(title), SHM->i18nstr[cuser.language][2535], topic);
    snprintf(genbuf, sizeof(genbuf), "%s\n\n%s%s\n%s%s",
         SHM->i18nstr[cuser.language][2536], SHM->i18nstr[cuser.language][2537], topic, SHM->i18nstr[cuser.language][2538], cuser.userid);
    strcat(genbuf, SHM->i18nstr[cuser.language][2539]);
    break;
    default:
    return FULLUPDATE;
    }
    outs(SHM->i18nstr[cuser.language][2540]);
    for (temp = 12; temp < 17; temp++) {
        if (!getdata(temp, 0, SHM->i18nstr[cuser.language][2541], topic, 60, DOECHO))
        break;
        strcat(genbuf, topic);
        strcat(genbuf, "\n");
    }
    if (temp == 11)
        return FULLUPDATE;
    strcat(genbuf, SHM->i18nstr[cuser.language][2542]);
    now += 14 * 24 * 60 * 60;
    snprintf(topic, sizeof(topic), "(%ld)", now);
    strcat(genbuf, topic);
    strcat(genbuf, ctime(&now));
    now -= 14 * 24 * 60 * 60;
    strcat(genbuf, SHM->i18nstr[cuser.language][2543]);
    strcat(genbuf, SHM->i18nstr[cuser.language][2544]);
    outs(SHM->i18nstr[cuser.language][2545]);
    setbpath(fpath, currboard);
    stampfile(fpath, &votefile);

    if (!(fp = fopen(fpath, "w"))) {
    outs(SHM->i18nstr[cuser.language][2546]);
    return FULLUPDATE;
    }
    fprintf(fp, "%s%s %s%s\n%s%s\n%s%s", SHM->i18nstr[cuser.language][2547], cuser.userid,
        SHM->i18nstr[cuser.language][2548], currboard,
        SHM->i18nstr[cuser.language][2549], title,
        SHM->i18nstr[cuser.language][2550], ctime(&now));
    fprintf(fp, "%s\n", genbuf);
    fclose(fp);
    strlcpy(votefile.owner, cuser.userid, sizeof(votefile.owner));
    strlcpy(votefile.title, title, sizeof(votefile.title));
    votefile.filemode |= FILE_VOTE;
    setbdir(genbuf, currboard);
    if (append_record(genbuf, &votefile, sizeof(votefile)) != -1)
    setbtotal(currbid);
    do_voteboardreply(&votefile);
    return FULLUPDATE;
}