/* *************************************************
* *********** README ******************************
* *************************************************
*
* COMPILE : make
* RUN : ./locktests -n <number of concurent process> -f <test file> [-P]
*
* GOAL : This test tries to stress the fcntl locking functions. A
* master process sets a lock on a file region (this is called "byte
* range locking"). Some slave processes try to perform operations on
* this region, such as read, write, set a new lock ... The expected
* results of these operations are known. If the operation's result is
* the same as the expected one, the test suceeds, else it fails.
*
* Slaves are either concurent processes or threads.
* -n <num> : Number of threads to use (mandatory).
* -f <file> : Run the test on a test file defined by the -f option (mandatory).
* -T : Use threads instead of processes (optional).
*
* HISTORY : This program has been written to stress NFSv4 locks. -P
* option was created to verify NFSv4 locking was thread-aware, and so,
* locking behaviour over NFSv4 was POSIX correct both using threads and
* process. This option may not be usefull to stress.
*
* EXAMPLE : ./locktests -n 50 -f /file/system/to/test
*
*
* Vincent ROQUETA 2005 - vincent.roqueta@ext.bull.net
* BULL S.A.
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <math.h>
#ifdef STDARG
#include <stdarg.h>
#endif
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/param.h>
#include <sys/times.h>
#ifdef MMAP
#include <sys/mman.h>
#endif
#include <inttypes.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/select.h>
#ifdef O_SYNC
#define OPENFLAGS (O_CREAT | O_RDWR | O_SYNC )
#else
#define OPENFLAGS (O_CREAT | O_RDWR )
#endif
#define OPENMODES (0600)
#define MANDMODES (0600)
/*(02666)*/
#define SUCCES 1
#define ECHEC 0
#define TRUE 1
#define FALSE 0
#define PROCESS 0
#define THREAD 1
//#define DEBUG
#ifdef DEBUG
#define E(a) perror(a)
#define P(a,b) printf(a,b)
#else
#define E(a)
#define P(a,b)
#endif
#ifndef LOCKTESTS_H
#define LOCKTESTS_H
#define M_SIZE 512
int writeToAllClients(char *foo);
int serverReceiveNet();
int clientReceiveNet();
int serverReceiveClient(int n);
int setupClients(int type, char *fname, int nThread);
int serverCloseConnection();
int getConfiguration(int *type, char *fname, int *nThread);
int readFromServer(char *message);
int serverSendClient(int n);
enum state_t {
CLEAN,
RDONLY,
RESULT,
WRONLY,
SELECT,
LOCK,
SYNC,
END,
READLOCK,
WRITELOCK,
BYTELOCK,
BYTELOCK_READ,
BYTELOCK_WRITE
};
/* Public data */
struct dataPub {
/* Number of clients */
int nclnt;
/* List of master to slave pipes */
int **lclnt;
/* Slave to master pipe */
int master[2];
/* Thread list */
pthread_t *lthreads;
/* test file name */
char *fname;
/* test file file-descriptor */
int fd;
/* Detailed error messages */
int verbose;
};
/* private data */
struct dataPriv {
/* thread number */
int whoami;
};
struct dataChild{
struct dataPub *dp;
struct dataPriv *dpr;
};
struct s_test {
int test;
int type;
char *nom;
int resAtt;
};
int configureServer(int max);
int configureClient(char *s);
#endif