add directory study
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user