Startpunkten
This commit is contained in:
213
s_stub.c
Normal file
213
s_stub.c
Normal file
@@ -0,0 +1,213 @@
|
||||
/* ***************************************** */
|
||||
|
||||
/* Laboration 2 i Datakommunikation 2 */
|
||||
|
||||
/* RPC-lib */
|
||||
|
||||
/* ***************************************** */
|
||||
|
||||
/* s_stub.c */
|
||||
|
||||
/* Ansvarar för att operationer utförs */
|
||||
|
||||
/* utförs på rätt sätt i servern */
|
||||
|
||||
/* ***************************************** */
|
||||
|
||||
/* Christian Ohlsson, di7chro@cse.kau.se */
|
||||
|
||||
/* Stefan Sonesson, di7stes@cse.kau.se */
|
||||
|
||||
/* ***************************************** */
|
||||
|
||||
|
||||
|
||||
#include "header.h"
|
||||
|
||||
|
||||
|
||||
/* Globala variabler */
|
||||
|
||||
int data_sockfd; /* Den socket som data färdas på */
|
||||
|
||||
msg myMsg; /* Meddelandet som funktionerna fyller i */
|
||||
|
||||
|
||||
|
||||
/* ==============================================
|
||||
|
||||
printsin()
|
||||
|
||||
Skriver ut information om klienten
|
||||
|
||||
============================================== */
|
||||
|
||||
printsin(struct sockaddr_in *sin, char *m1, char *m2 ) {
|
||||
|
||||
struct hostent *gethostbyaddr(), *h;
|
||||
|
||||
printf ("%s %s\n", m1, m2);
|
||||
|
||||
printf ("Family %d addr %x port %d\n", sin -> sin_family,
|
||||
|
||||
ntohl(sin -> sin_addr.s_addr), ntohs(sin -> sin_port));
|
||||
|
||||
h = gethostbyaddr((char *)&sin->sin_addr, sizeof(int), AF_INET);
|
||||
|
||||
printf ("Symbolic host name <%s>\n",h->h_name);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ==============================================
|
||||
|
||||
rem_open()
|
||||
|
||||
Öppnar en fil och fyller i data såsom
|
||||
|
||||
längd och fildeskriptor i strukten.
|
||||
|
||||
============================================== */
|
||||
|
||||
void rem_open() {
|
||||
|
||||
int fd;
|
||||
|
||||
struct stat st;
|
||||
|
||||
if((fd = open(myMsg.path, O_CREAT|O_RDWR|O_APPEND, PERMS)) < 0) {
|
||||
|
||||
myMsg.op = OPN; /* Skicka fel till klient */
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
fstat(fd, &st);
|
||||
|
||||
myMsg.length = st.st_size;
|
||||
|
||||
myMsg.op = OPP; /* Operationen gick bra */
|
||||
|
||||
myMsg.fd = fd;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ==============================================
|
||||
|
||||
rem_read()
|
||||
|
||||
Läser data ur en fil tills EOF tecknet nås och
|
||||
|
||||
dessa tecken stoppas i en buffer, som slutligen
|
||||
|
||||
returneras
|
||||
|
||||
============================================== */
|
||||
|
||||
char *rem_read() {
|
||||
|
||||
char *buf;
|
||||
|
||||
int fd;
|
||||
|
||||
lseek(myMsg.fd, 0, SEEK_SET);
|
||||
|
||||
buf = (char*)malloc(myMsg.length);
|
||||
|
||||
|
||||
|
||||
if((read(myMsg.fd, buf, myMsg.length)) < 0)
|
||||
|
||||
myMsg.op = RDN; /* Skicka fel till klient */
|
||||
|
||||
else
|
||||
|
||||
myMsg.op = RDP; /* Operationen gick bra */
|
||||
|
||||
return buf;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ==============================================
|
||||
|
||||
rem_write()
|
||||
|
||||
Skriver tecken till fil
|
||||
|
||||
============================================== */
|
||||
|
||||
void rem_write() {
|
||||
|
||||
if((write(myMsg.fd, myMsg.data, myMsg.length)) < 0)
|
||||
|
||||
myMsg.op = WRN; /* Skicka fel till klient */
|
||||
|
||||
else
|
||||
|
||||
myMsg.op = WRP; /* Operationen gick bra */
|
||||
|
||||
}
|
||||
|
||||
/* ==============================================
|
||||
|
||||
rem_delete()
|
||||
|
||||
Tar bort en fil mha unlink, som egentligen
|
||||
|
||||
räknar ner antalet länkar till en fil
|
||||
|
||||
============================================== */
|
||||
|
||||
int rem_delete() {
|
||||
|
||||
if((unlink(myMsg.path)) < 0) {
|
||||
|
||||
myMsg.op = DLN; /* Skicka fel till klient */
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
else {
|
||||
|
||||
myMsg.op = DLP; /* Operationen gick bra */
|
||||
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ==============================================
|
||||
|
||||
rem_close()
|
||||
|
||||
Stänger en fil.
|
||||
|
||||
Returnerar svar om hur det gick
|
||||
|
||||
============================================== */
|
||||
|
||||
int rem_close() {
|
||||
|
||||
if((close(myMsg.fd)) < 0) {
|
||||
|
||||
myMsg.op = CLN; /* Skicka fel till klient */
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
else {
|
||||
|
||||
myMsg.op = CLP; /* Operationen gick bra */
|
||||
|
||||
return 1;
|
||||
Reference in New Issue
Block a user