105 lines
2.0 KiB
C
105 lines
2.0 KiB
C
#include <amoeba.h>
|
|
#include <minix/callnr.h>
|
|
#include <errno.h>
|
|
#include "header.h"
|
|
|
|
header hdr; /* header for incoming messages */
|
|
char buffer[BUF_SIZE+NAME_SIZE]; /* buffer for incoming messages */
|
|
char *server_name = "filsrv";
|
|
int repsize;
|
|
extern int errno;
|
|
|
|
main()
|
|
{
|
|
/* This is a primitive file server. The client runs with a special set of
|
|
* routines for read(), write(), etc. that call this server. The server is
|
|
* stateless.
|
|
*/
|
|
|
|
int s;
|
|
int count;
|
|
unshort opcode, size;
|
|
|
|
strncpy( (char *) &hdr.h_port, server_name, PORTSIZE); /* init port */
|
|
|
|
while (1) {
|
|
/* Wait for a request to arrive. */
|
|
count = (short) getreq(&hdr, buffer, MAX_TRANS);
|
|
if (count < 0) {
|
|
printf("Server's getreq failed. Error = %d. ", count);
|
|
printf("Hit F1 to see if AMTASK running.\n");
|
|
exit(1);
|
|
}
|
|
|
|
/* Dispatch on opcode. */
|
|
opcode = hdr.h_command;
|
|
repsize = 0;
|
|
errno = 0;
|
|
switch(opcode) {
|
|
case CREAT: s = do_creat(); break;
|
|
case READ: s = do_read(); break;
|
|
case WRITE: s = do_write(); break;
|
|
default: s = EINVAL; break;
|
|
}
|
|
|
|
/* Work done. Send a reply. */
|
|
hdr.h_status = (unshort) s;
|
|
hdr.h_extra = (unshort) errno;
|
|
putrep(&hdr, buffer, repsize);
|
|
}
|
|
}
|
|
|
|
int do_read()
|
|
{
|
|
/* Stateless read. */
|
|
|
|
int fd, n;
|
|
long offset;
|
|
unshort count;
|
|
|
|
offset = hdr.h_offset;
|
|
count = hdr.h_size;
|
|
if (count > MAX_TRANS) count = MAX_TRANS;
|
|
|
|
fd = open(buffer, 0); /* open the file for reading */
|
|
if (fd < 0) return(errno);
|
|
lseek(fd, offset, 0);
|
|
n = read(fd, buffer, count);
|
|
close(fd);
|
|
repsize = n;
|
|
return(n);
|
|
}
|
|
|
|
int do_write()
|
|
{
|
|
/* Stateless write. */
|
|
|
|
int fd, n;
|
|
long offset;
|
|
unshort count;
|
|
|
|
offset = hdr.h_offset;
|
|
count = hdr.h_size;
|
|
if (count > MAX_TRANS) count = MAX_TRANS;
|
|
|
|
fd = open(&buffer[BUF_SIZE], 2); /* open the file for writing */
|
|
if (fd < 0) return(errno);
|
|
lseek(fd, offset, 0);
|
|
n = write(fd, buffer, count);
|
|
close(fd);
|
|
return(n);
|
|
}
|
|
|
|
int do_creat()
|
|
{
|
|
/* Stateless creat. */
|
|
|
|
int fd, n, mode;
|
|
|
|
|
|
mode = hdr.h_size;
|
|
fd = creat(buffer, mode); /* creat the file */
|
|
close(fd);
|
|
return(fd);
|
|
}
|