summaryrefslogblamecommitdiffstats
path: root/mbbsd/passwd.c
blob: a9b32f0c0d29fe9af1c565da1d9b3b02b387fdd2 (plain) (tree)
1
2
3
4
                                                       
                
 
                           










                   



                                                                   


      
   

             
                                                                           

                              
                                                            
                              



                                 

                             

            

                          
                  
                                                


                             
     
 


             
   




                                   
                             
                    
                                  
                              
             
 
 
   



                                      

                              
                                              



                                                         


             
   



                                     
                  
                                                



                                                         


             
   




                                      
                                   
                                    
                        
     


             
    




                                            




                        
    




                                           



                        
/* $Id: passwd.c,v 1.8 2002/07/21 09:26:02 in2 Exp $ */
#include "bbs.h"

static int      semid = -1;

#ifndef SEM_R
#define SEM_R 0400
#endif

#ifndef SEM_A
#define SEM_A 0200
#endif

#ifndef __FreeBSD__
union semun {
    int             val;    /* value for SETVAL */
    struct semid_ds *buf;   /* buffer for IPC_STAT & IPC_SET */
    u_short        *array;  /* array for GETALL & SETALL */
    struct seminfo *__buf;  /* buffer for IPC_INFO */
};
#endif

int
passwd_init()
{
    semid = semget(PASSWDSEM_KEY, 1, SEM_R | SEM_A | IPC_CREAT | IPC_EXCL);
    if (semid == -1) {
    if (errno == EEXIST) {
        semid = semget(PASSWDSEM_KEY, 1, SEM_R | SEM_A);
        if (semid == -1) {
        perror("semget");
        exit(1);
        }
    } else {
        perror("semget");
        exit(1);
    }
    } else {
    union semun     s;

    s.val = 1;
    if (semctl(semid, 0, SETVAL, s) == -1) {
        perror("semctl");
        exit(1);
    }
    }

    return 0;
}

int
passwd_update_money(int num)
{
    userec_t        user;
    if (num < 1 || num > MAX_USERS)
    return -1;
    passwd_query(num, &user);
    if (SHM->loaded)
    user.money = moneyof(num);
    passwd_update(num, &user);
    return 0;
}

int
passwd_update(int num, userec_t * buf)
{
    int             pwdfd;
    if (num < 1 || num > MAX_USERS)
    return -1;
    buf->money = moneyof(num);
    if ((pwdfd = open(fn_passwd, O_RDWR)) < 0)
    exit(1);
    lseek(pwdfd, sizeof(userec_t) * (num - 1), SEEK_SET);
    write(pwdfd, buf, sizeof(userec_t));
    close(pwdfd);
    return 0;
}

int
passwd_query(int num, userec_t * buf)
{
    int             pwdfd;
    if (num < 1 || num > MAX_USERS)
    return -1;
    if ((pwdfd = open(fn_passwd, O_RDONLY)) < 0)
    exit(1);
    lseek(pwdfd, sizeof(userec_t) * (num - 1), SEEK_SET);
    read(pwdfd, buf, sizeof(userec_t));
    close(pwdfd);
    return 0;
}

int
passwd_apply(int (*fptr) (userec_t *))
{
    int             i;
    userec_t        user;
    for (i = 0; i < MAX_USERS; i++) {
    passwd_query(i + 1, &user);
    if ((*fptr) (&user) == QUIT)
        return QUIT;
    }
    return 0;
}

void
passwd_lock()
{
    struct sembuf   buf = {0, -1, SEM_UNDO};

    if (semop(semid, &buf, 1)) {
    perror("semop");
    exit(1);
    }
}

void
passwd_unlock()
{
    struct sembuf   buf = {0, 1, SEM_UNDO};

    if (semop(semid, &buf, 1)) {
    perror("semop");
    exit(1);
    }
}