diff --git a/include/minix/libmsgque.h b/include/minix/libmsgque.h index 369ecd9..9e868c0 100644 --- a/include/minix/libmsgque.h +++ b/include/minix/libmsgque.h @@ -6,7 +6,7 @@ * and structures associated with it */ -PUBLIC struct MsgQue { +struct MsgQue { int token; /* This identifies the Message Queue uniquely * Multiple applications can use same key to * operate of single queue in multicast mode */ diff --git a/servers_pm/msgque.c b/servers_pm/msgque.c index bd4b5f7..fad9858 100644 --- a/servers_pm/msgque.c +++ b/servers_pm/msgque.c @@ -26,7 +26,7 @@ #include "mproc.h" #include "param.h" -PRIVATE MQueue mQueue_[MQ_MAX_MSGQUES]; +struct MQueue mQueues_[MQ_MAX_MSGQUES]; @@ -34,19 +34,19 @@ PRIVATE int cleanOnTimer( ) { /* Need to call this periodically using timer call return 0; } -PRIVATE int insertUser( MQueue *mq, int proc_nr) { +PRIVATE int insertUser( struct MQueue *mq, int proc_nr) { return 0; } -PRIVATE int removeUser( MQueue *mq, int proc_nr ) { +PRIVATE int removeUser( struct MQueue *mq, int proc_nr ) { return 0; } /* This is not supposed to fail */ -PRIVATE int setUserProperty( MQueue *mq, int type, int state ) { +PRIVATE int setUserProperty( struct MQueue *mq, int type, int state ) { - MQUser *user = mq->userHead; + struct MQUser *user = mq->userHead; while( user ) { if( user->proc_nr == who_p ) { user->type = type; @@ -57,7 +57,7 @@ PRIVATE int setUserProperty( MQueue *mq, int type, int state ) { return MQ_SUCCESS; } -PRIVATE int insertMessage( MQueue *mq, char *message ) { +PRIVATE int insertMessage( struct MQueue *mq, char *message ) { if( mq->queueLen == MQ_MAX_MESSAGES ) return (MQ_ERR_MAX_MESSAGES); @@ -67,30 +67,39 @@ PRIVATE int insertMessage( MQueue *mq, char *message ) { return MQ_SUCCESS; } -PRIVATE int readReciever( MQueue *mq ) { +PRIVATE int readMessage( struct MQueue *mq, char *message ) { + return MQ_SUCCESS; +} + +/* Called by readReciever */ +PRIVATE int readReciever( struct MQueue *mq ) { /* if you are the last reciever in the queue * then delete the element from MsgNode */ return MQ_SUCCESS; } -/* Called by readReciever */ -PRIVATE int removeMessage( MQueue *mq ) { +PRIVATE int removeMessage( struct MQueue *mq ) { mq->queueLen--; return MQ_SUCCESS; } +PRIVATE int removeAllMessages( struct MQueue *mq ) { + return MQ_SUCCESS; +} + PUBLIC int do_minit(message *m) { int token = 0; + int i = 0; int firstFreeQueue = -1; - MsgQue *user_mq; + struct MsgQue *user_mq; printf("\nCS551 I am inside minit!\n"); /* Read token and MsgQue */ token = m_in.m1_i1; - sys_datacopy(who_p, (virbytes) m_in.m1_p1, SELF, (virbytes) user_mq, sizeof(MsgQue) ); + sys_datacopy(who_p, (phys_bytes) m_in.m1_p1, SELF, (phys_bytes) user_mq, sizeof(struct MsgQue) ); /* Check if already exists MQueue with such token * If Yes, return MQueue address in MsgQueue->queue @@ -98,8 +107,8 @@ PUBLIC int do_minit(message *m) */ for( i=0; i< MQ_MAX_MSGQUES ; i++) { if( mQueues_[i].token == i ) { - user_mq->queue = &mQueue_[i]; - sys_datacopy(SELF, (virbytes) user_mq, who_p, (virbytes) m_in.m1_p1, sizeof(MsgQue) ); + user_mq->queue = &mQueues_[i]; + sys_datacopy(SELF, (phys_bytes) user_mq, who_p, (phys_bytes) m_in.m1_p1, sizeof(struct MsgQue) ); return( MQ_SUCCESS ); } if( mQueues_[i].token = -1 && firstFreeQueue == -1 ) @@ -111,11 +120,11 @@ PUBLIC int do_minit(message *m) return ( MQ_ERR_MAX_MSGQUE ); /* This is new request so, give him a new MQueue */ - mQueue_[ firstFreeQueue ].token = token; - insertUser( &mQueue_[i], who_p ); + mQueues_[ firstFreeQueue ].token = token; + insertUser( &mQueues_[i], who_p ); - user_mq->queue = &mQueue_[i]; - sys_datacopy(SELF, (virbytes) user_mq, who_p, (virbytes) m_in.m1_p1, sizeof(MsgQue) ); + user_mq->queue = &mQueues_[i]; + sys_datacopy(SELF, (phys_bytes) user_mq, who_p, (phys_bytes) m_in.m1_p1, sizeof(struct MsgQue) ); return MQ_SUCCESS; } @@ -123,15 +132,15 @@ PUBLIC int do_minit(message *m) PUBLIC int do_msend(message *m) { int len; - MsgQue *user_mq; + struct MsgQue *user_mq; char *message; - MQueue *mq; + struct MQueue *mq; printf("\nCS551 I am inside msend!\n"); /* Read token and MsgQue */ len = m_in.m1_i1; - sys_datacopy(who_p, (virbytes) m_in.m1_p1, SELF, (virbytes) user_mq, sizeof(MsgQue) ); - sys_datacopy(who_p, (virbytes) m_in.m1_p2, SELF, (virbytes) message, len ); + sys_datacopy(who_p, (phys_bytes) m_in.m1_p1, SELF, (phys_bytes) user_mq, sizeof(struct MsgQue) ); + sys_datacopy(who_p, (phys_bytes) m_in.m1_p2, SELF, (phys_bytes) message, len ); /* Validate that such token/queue exists */ mq = user_mq->queue; @@ -146,7 +155,7 @@ PUBLIC int do_msend(message *m) pause(); /* Add message to mq->MsgNode */ - removeSender( mq, who_p ); + removeUser( mq, who_p ); setUserProperty( mq, MQ_SENDER, MQ_USER_ACTIVE ); return MQ_SUCCESS; } @@ -156,9 +165,9 @@ PUBLIC int do_msend(message *m) /* Wake-up Recievers if they are sleeping */ if( mq->userHead ) { - MQUser *user = mq->userHead; - while( user && user->type==MQ_RECIEVER && user->state=MQ_USER_BLOCKED ) { - unpause( user->proc_nr ); /* Wake-up */ + struct MQUser *user = mq->userHead; + while( user && user->type==MQ_RECIEVER && user->state==MQ_USER_BLOCKED ) { + /*unpause( user->proc_nr ); /* Wake-up */ user = user->next; } } @@ -169,14 +178,14 @@ PUBLIC int do_msend(message *m) PUBLIC int do_mrecv(message *m) { int len; - MsgQue *user_mq; + struct MsgQue *user_mq; char *message; - MQueue *mq; + struct MQueue *mq; printf("\nCS551 I am inside mrecv!\n"); /* Read token and MsgQue */ len = m_in.m1_i1; - sys_datacopy(who_p, (virbytes) m_in.m1_p1, SELF, (virbytes) user_mq, sizeof(MsgQue) ); + sys_datacopy(who_p, (phys_bytes) m_in.m1_p1, SELF, (phys_bytes) user_mq, sizeof(struct MsgQue) ); /* Validate that such token/queue exists */ mq = user_mq->queue; @@ -184,7 +193,7 @@ PUBLIC int do_mrecv(message *m) return ( ERR_INVALID_MQ ); /* Block if MQueue is EMPTY */ - if( mq->MsgNode == NULL ) { + if( mq->msgHead == NULL ) { setUserProperty( mq, MQ_RECIEVER, MQ_USER_BLOCKED ); /* Block Reciever */ @@ -197,10 +206,10 @@ PUBLIC int do_mrecv(message *m) readMessage( mq, message ); /* Wake-up Sender if they are sleeping */ - if( mq->shead ) { - MQUser *user = mq->userHead; - while( user && user->type==MQ_SENDER && user->state=MQ_USER_BLOCKED ) { - unpause( user->proc_nr ); /* Wake-up */ + if( mq->userHead ) { + struct MQUser *user = mq->userHead; + while( user && user->type==MQ_SENDER && user->state==MQ_USER_BLOCKED ) { + /*unpause( user->proc_nr ); /* Wake-up */ user = user->next; } } @@ -210,25 +219,26 @@ PUBLIC int do_mrecv(message *m) PUBLIC int do_mclose(message *m) { - MsgQue *user_mq; - MQueue *mq; + int token; + struct MsgQue *user_mq; + struct MQueue *mq; printf("\nCS551 I am inside mclose!\n"); /* Read MsgQue */ token = m_in.m1_i1; - sys_datacopy(who_p, (virbytes) m_in.m1_p1, SELF, (virbytes) user_mq, sizeof(MsgQue) ); + sys_datacopy(who_p, (phys_bytes) m_in.m1_p1, SELF, (phys_bytes) user_mq, sizeof(struct MsgQue) ); /* Validate that such token/queue exists */ mq = user_mq->queue; - if( INVALID_MQ( mq, user_mq->token ) || mq.userHead == NULL ) + if( INVALID_MQ( mq, user_mq->token ) || mq->userHead == NULL ) return ( ERR_INVALID_MQ ); /* Remove element from userHead */ removeUser( mq, who_p ); - if( mq.userHead == NULL ) { /* free the Message Queue */ - mq.token = MQ_FREE; - mq.queueLen = 0; + if( mq->userHead == NULL ) { /* free the Message Queue */ + mq->token = MQ_FREE; + mq->queueLen = 0; removeAllMessages( mq ); } @@ -237,20 +247,20 @@ PUBLIC int do_mclose(message *m) PUBLIC int do_mclean(message *m) { - MsgQue *user_mq; - int rc; - MQueue *mq; - MQUser *user; + struct MsgQue *user_mq; + int token,rc; + struct MQueue *mq; + struct MQUser *user; printf("\nCS551 I am inside mclean!\n"); /* Read MsgQue */ token = m_in.m1_i1; - sys_datacopy(who_p, (virbytes) m_in.m1_p1, SELF, (virbytes) user_mq, sizeof(MsgQue) ); + sys_datacopy(who_p, (phys_bytes) m_in.m1_p1, SELF, (phys_bytes) user_mq, sizeof(struct MsgQue) ); /* Validate that such token/queue exists */ mq = user_mq->queue; - if( INVALID_MQ( mq, user_mq->token ) || mq.userHead == NULL ) + if( INVALID_MQ( mq, user_mq->token ) || mq->userHead == NULL ) return ( ERR_INVALID_MQ ); /* Ping every one and see if they are all alive */ @@ -267,8 +277,8 @@ PUBLIC int do_mclean(message *m) return( ERR_MQ_INUSE ); /* Free the MQueue */ - mq.token = MQ_FREE; - mq.queueLen = 0; + mq->token = MQ_FREE; + mq->queueLen = 0; removeAllMessages( mq ); return MQ_SUCCESS; diff --git a/servers_pm/msgque.h b/servers_pm/msgque.h index 0c5d034..afe61bf 100644 --- a/servers_pm/msgque.h +++ b/servers_pm/msgque.h @@ -11,13 +11,13 @@ /* This structure hold all MQ users who are registered * */ -typedef struct MQUser_t{ /* Dynamically allocated */ +struct MQUser { /* Dynamically allocated */ int messageNo; /* This is the last message recieve used */ int proc_nr; /* Receiver's process number */ int state; /* Blocked or Active */ int type; /* Sender or reciever = has meaning only with 'state' */ - struct MQUser_t *next; /* If many are waiting to read message */ -} MQUser; + struct MQUser *next; /* If many are waiting to read message */ +}; /* * Linked list maintaining all the message posted by msend @@ -34,13 +34,13 @@ struct MsgNode { struct MsgNode *next; }; -typedef struct { +struct MQueue{ int token; /* Unique identifier for this message queue, * user gives this */ int queueLen; struct MsgNode *msgHead; - MQUser *userHead; -} MQueue; -#define INVALID_MQ( mq, tok ) (mq < mQueue[0] || mq > mQueue[MQ_MAX_MSGQUES] || mq->token != tok ) + struct MQUser *userHead; +} ; +#define INVALID_MQ( mq, tok ) (mq < &mQueues_[0] || mq > &mQueues_[MQ_MAX_MSGQUES] || mq->token != tok ) - \ No newline at end of file + diff --git a/servers_pm/proto.h b/servers_pm/proto.h index 8865afc..d9bf0b0 100644 --- a/servers_pm/proto.h +++ b/servers_pm/proto.h @@ -8,11 +8,11 @@ struct memory; #include /* project 2: multicast */ -_PROTOTYPE( int do_minit, (void)); -_PROTOTYPE( int do_msend, (void)); -_PROTOTYPE( int do_mrecv, (void)); -_PROTOTYPE( int do_mclose, (void)); -_PROTOTYPE( int do_mclean, (void)); +_PROTOTYPE( int do_minit, (message *m)); +_PROTOTYPE( int do_msend, (message *m)); +_PROTOTYPE( int do_mrecv, (message *m)); +_PROTOTYPE( int do_mclose, (message *m)); +_PROTOTYPE( int do_mclean, (message *m)); /* alarm.c */ _PROTOTYPE( int do_alarm, (void) ); diff --git a/servers_pm/table.c b/servers_pm/table.c index cb26923..b4a1cf1 100644 --- a/servers_pm/table.c +++ b/servers_pm/table.c @@ -125,11 +125,11 @@ _PROTOTYPE (int (*call_vec[]), (void) ) = { do_getdma, /* 110 = getdma */ do_srv_kill, /* 111 = srv_kill */ no_sys, /* 112 = gcov_flush */ - do_minit, /* 113 */ - do_mrecv, /* 114 */ - do_msend, /* 115 */ - do_mclose, /* 116 */ - do_mclean, /* 117 */ + do_minit, /* 113 = minit */ + do_mrecv, /* 114 = mrecv */ + do_msend, /* 115 = msend */ + do_mclose, /* 116 = mclose */ + do_mclean /* 117 = mclean */ }; /* This should not fail with "array size is negative": */ extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1]; diff --git a/servers_vfs/table.c b/servers_vfs/table.c new file mode 100644 index 0000000..2d33354 --- /dev/null +++ b/servers_vfs/table.c @@ -0,0 +1,150 @@ +/* This file contains the table used to map system call numbers onto the + * routines that perform them. + */ + +#define _TABLE + +#include "fs.h" +#include +#include +#include "file.h" +#include "fproc.h" +#include "lock.h" +#include "vnode.h" +#include "vmnt.h" + + +PUBLIC _PROTOTYPE (int (*call_vec[]), (void) ) = { + no_sys, /* 0 = unused */ + no_sys, /* 1 = (exit) */ + no_sys, /* 2 = (fork) */ + do_read, /* 3 = read */ + do_write, /* 4 = write */ + do_open, /* 5 = open */ + do_close, /* 6 = close */ + no_sys, /* 7 = wait */ + do_creat, /* 8 = creat */ + do_link, /* 9 = link */ + do_unlink, /* 10 = unlink */ + no_sys, /* 11 = waitpid */ + do_chdir, /* 12 = chdir */ + no_sys, /* 13 = time */ + do_mknod, /* 14 = mknod */ + do_chmod, /* 15 = chmod */ + do_chown, /* 16 = chown */ + no_sys, /* 17 = break */ + do_stat, /* 18 = stat */ + do_lseek, /* 19 = lseek */ + no_sys, /* 20 = getpid */ + do_mount, /* 21 = mount */ + do_umount, /* 22 = umount */ + no_sys, /* 23 = (setuid) */ + no_sys, /* 24 = getuid */ + no_sys, /* 25 = (stime) */ + no_sys, /* 26 = ptrace */ + no_sys, /* 27 = alarm */ + do_fstat, /* 28 = fstat */ + no_sys, /* 29 = pause */ + do_utime, /* 30 = utime */ + no_sys, /* 31 = (stty) */ + no_sys, /* 32 = (gtty) */ + do_access, /* 33 = access */ + no_sys, /* 34 = (nice) */ + no_sys, /* 35 = (ftime) */ + do_sync, /* 36 = sync */ + no_sys, /* 37 = kill */ + do_rename, /* 38 = rename */ + do_mkdir, /* 39 = mkdir */ + do_unlink, /* 40 = rmdir */ + do_dup, /* 41 = dup */ + do_pipe, /* 42 = pipe */ + no_sys, /* 43 = times */ + no_sys, /* 44 = (prof) */ + do_slink, /* 45 = symlink */ + no_sys, /* 46 = (setgid)*/ + no_sys, /* 47 = getgid */ + no_sys, /* 48 = (signal)*/ + do_rdlink, /* 49 = readlink*/ + do_lstat, /* 50 = lstat */ + no_sys, /* 51 = (acct) */ + no_sys, /* 52 = (phys) */ + no_sys, /* 53 = (lock) */ + do_ioctl, /* 54 = ioctl */ + do_fcntl, /* 55 = fcntl */ + no_sys, /* 56 = (mpx) */ + do_fslogin, /* 57 = FS proc login */ + no_sys, /* 58 = unused */ + no_sys, /* 59 = (execve)*/ + do_umask, /* 60 = umask */ + do_chroot, /* 61 = chroot */ + no_sys, /* 62 = (setsid)*/ + no_sys, /* 63 = (getpgrp)*/ + no_sys, /* 64 = (itimer)*/ + no_sys, /* 65 = unused */ + no_sys, /* 66 = unused */ + no_sys, /* 67 = unused */ + no_sys, /* 68 = unused */ + no_sys, /* 69 = unused */ + no_sys, /* 70 = unused */ + no_sys, /* 71 = (sigaction) */ + no_sys, /* 72 = (sigsuspend) */ + no_sys, /* 73 = (sigpending) */ + no_sys, /* 74 = (sigprocmask) */ + no_sys, /* 75 = (sigreturn) */ + no_sys, /* 76 = (reboot) */ + do_svrctl, /* 77 = svrctl */ + no_sys, /* 78 = (sysuname) */ + do_getsysinfo, /* 79 = getsysinfo */ + do_getdents, /* 80 = getdents */ + do_llseek, /* 81 = llseek */ + do_fstatfs, /* 82 = fstatfs */ + do_statvfs, /* 83 = fstatvfs */ + do_fstatvfs, /* 84 = statvfs */ + do_select, /* 85 = select */ + do_fchdir, /* 86 = fchdir */ + do_fsync, /* 87 = fsync */ + no_sys, /* 88 = (getpriority) */ + no_sys, /* 89 = (setpriority) */ + no_sys, /* 90 = (gettimeofday) */ + no_sys, /* 91 = (seteuid) */ + no_sys, /* 92 = (setegid) */ + do_truncate, /* 93 = truncate */ + do_ftruncate, /* 94 = truncate */ + do_chmod, /* 95 = fchmod */ + do_chown, /* 96 = fchown */ + no_sys, /* 97 = getsysinfo_up */ + no_sys, /* 98 = (sprofile) */ + no_sys, /* 99 = (cprofile) */ + /* THE MINIX3 ABI ENDS HERE */ + no_sys, /* 100 = (exec_newmem) */ + no_sys, /* 101 = (srv_fork) */ + no_sys, /* 102 = (exec_restart) */ + no_sys, /* 103 = (procstat) */ + no_sys, /* 104 = (getprocnr) */ + no_sys, /* 105 = unused */ + no_sys, /* 106 = unused */ + no_sys, /* 107 = (getepinfo) */ + no_sys, /* 108 = (adddma) */ + no_sys, /* 109 = (deldma) */ + no_sys, /* 110 = (getdma) */ + no_sys, /* 111 = (srv_kill) */ + do_gcov_flush, /* 112 = gcov_flush */ + no_sys, /* 113 = gcov_flush */ + no_sys, /* 114 = gcov_flush */ + no_sys, /* 115 = gcov_flush */ + no_sys, /* 116 = gcov_flush */ + no_sys /* 117 = gcov_flush */ +}; +/* This should not fail with "array size is negative": */ +extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1]; + +PUBLIC _PROTOTYPE (int (*pfs_call_vec[]), (void) ) = { + + no_sys, /* 0 */ + do_check_perms, /* 1 */ + do_verify_fd, /* 2 */ + do_set_filp, /* 3 */ + do_copy_filp, /* 4 */ + do_put_filp, /* 5 */ + do_cancel_fd /* 6 */ +};