Startpunkten
This commit is contained in:
78
Lab1/lab1.c
Normal file
78
Lab1/lab1.c
Normal file
@@ -0,0 +1,78 @@
|
||||
/* ===========================================
|
||||
* Lab 1 i C & UNIX
|
||||
* ==========================================
|
||||
* Semaforer
|
||||
* ==========================================
|
||||
* Christian Ohlsson, di7chro@cse.kau.se
|
||||
* Karlstads universitet
|
||||
* 991110
|
||||
* ===========================================
|
||||
*/
|
||||
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define WAITTIME 3
|
||||
#define PERMS 0000
|
||||
|
||||
int P(char *name){
|
||||
while(creat(name,PERMS) == -1) ;
|
||||
}
|
||||
void V(char *name){
|
||||
unlink(name);
|
||||
}
|
||||
void handleSig(){
|
||||
V("A");
|
||||
V("B");
|
||||
V("C");
|
||||
exit(0);
|
||||
}
|
||||
void A(){
|
||||
while(1) {
|
||||
P("A");
|
||||
write(1, "A", 1);
|
||||
V("B");
|
||||
sleep(WAITTIME);
|
||||
P("A");
|
||||
write(1, "A", 1);
|
||||
V("C");
|
||||
sleep(WAITTIME);
|
||||
}
|
||||
}
|
||||
void B(){
|
||||
while(1) {
|
||||
P("B");
|
||||
write(1, "B\n", 2);
|
||||
V("A");
|
||||
}
|
||||
}
|
||||
void C() {
|
||||
while(1) {
|
||||
P("C");
|
||||
write(1, "C\n", 2);
|
||||
V("A");
|
||||
}
|
||||
}
|
||||
int main() {
|
||||
int pidA, pidB, stat;
|
||||
if((signal(SIGINT, handleSig)) == SIG_ERR) {
|
||||
perror("\nCould not initialize signals\n");
|
||||
exit(0);
|
||||
}
|
||||
signal(SIGTERM, SIG_IGN);
|
||||
P("B");
|
||||
P("C");
|
||||
if((pidA=fork()) > 0) {
|
||||
if((pidB=fork()) > 0) {
|
||||
A();
|
||||
waitpid(pidA, &stat, 0);
|
||||
waitpid(pidB, &stat, 0);
|
||||
}
|
||||
if(pidB == 0)
|
||||
C();
|
||||
}
|
||||
if(pidA == 0)
|
||||
B();
|
||||
perror("\nCould not fork.\n");
|
||||
return 0;
|
||||
}
|
||||
249
Lab2/lab2.c
Normal file
249
Lab2/lab2.c
Normal file
@@ -0,0 +1,249 @@
|
||||
/*
|
||||
* Laboration 2 i C och UNIX
|
||||
*
|
||||
* Komplett shell
|
||||
* =========================================
|
||||
*
|
||||
* Christian Ohlsson, di7chro@cse.kau.se
|
||||
* Stefan Sonesson, di7stes@cse.kau.se
|
||||
*
|
||||
* Karlstads Universitet, 991209
|
||||
*
|
||||
*
|
||||
*===========================================
|
||||
*/
|
||||
#include "lab2.h"
|
||||
|
||||
extern treePtr tree;
|
||||
|
||||
/*Array med alla inmatningar som gjorts*/
|
||||
char *symTable[SYMTBLSIZE];
|
||||
|
||||
/*Global räknare för symTable*/
|
||||
int place=0;
|
||||
|
||||
/*Kopierar alla WORD & NULL till symTable*/
|
||||
int insert(char *str){
|
||||
if(str) symTable[place]=(char*)strdup(str);
|
||||
else symTable[place]=str;
|
||||
return place++;
|
||||
}
|
||||
|
||||
/*Rensar symTable*/
|
||||
void delTable() {
|
||||
int i=0;
|
||||
for(i=0 ; i<SYMTBLSIZE ; i++) symTable[i] = NULL;
|
||||
place=0;
|
||||
}
|
||||
|
||||
/*Exekverar varje kommando som en egen process*/
|
||||
void cmd(treePtr tPtr) {
|
||||
int pid, status;
|
||||
switch(pid=fork()){
|
||||
case -1: printf("Could not fork. (cmd)\n"); break;
|
||||
case 0: if((execvp(symTable[tPtr->index], &symTable[tPtr->index])) == -1) {
|
||||
fprintf(stderr, "Could not execute that.\n");
|
||||
exit(1); /* Child */
|
||||
}
|
||||
exit(1); break;
|
||||
default: if((waitpid(pid, &status,0)) == -1) { /* Parent */
|
||||
fprintf(stderr, "Could not wait. (cmd)\n");
|
||||
return;
|
||||
/*exit(1);*/
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*Hanterar pipes och ställer om fildescriptorer*/
|
||||
void pipa(treePtr tPtr) {
|
||||
int status, pfd[2];
|
||||
if((pipe(pfd)) == -1) {
|
||||
fprintf(stderr, "Pipe failed. (pipa) \n");
|
||||
return;
|
||||
}
|
||||
switch(fork()) {
|
||||
case -1: fprintf(stderr, "Fork failed. (pipa)\n");break;
|
||||
case 0 : if((dup2(pfd[1], 1)) == -1) { /* Child 1 */
|
||||
fprintf(stderr, "Could not dup.(pipa)\n");
|
||||
exit(1);
|
||||
}
|
||||
if((close(pfd[0])) == -1) {
|
||||
fprintf(stderr, "Could not close filedescriptor.(pipa)\n");
|
||||
exit(1);
|
||||
}
|
||||
doTree(tPtr->left);
|
||||
exit(1); break;
|
||||
default: /* Parent 1 */
|
||||
switch(fork()) {
|
||||
case -1: fprintf(stderr, "Fork failed(pipa)\n");break;
|
||||
case 0 : if((dup2(pfd[0], 0)) == -1) { /* Child 2 */
|
||||
fprintf(stderr, "Could not dup(pipa).\n");
|
||||
exit(1);
|
||||
}
|
||||
if((close(pfd[1])) == -1) {
|
||||
fprintf(stderr, "Could not close filedescriptor.(pipa)\n");
|
||||
exit(1);
|
||||
}
|
||||
doTree(tPtr->right);
|
||||
exit(1); break;
|
||||
default: if((close(pfd[0])) == -1) { /* Parent 2 */
|
||||
fprintf(stderr, "Could not close filedescriptor 0.(pipa)\n");
|
||||
exit(1);
|
||||
}
|
||||
if((close(pfd[1])) == -1) {
|
||||
fprintf(stderr, "Could not close filedescriptor 1.(pipa)\n");
|
||||
exit(1);
|
||||
}
|
||||
if((wait(&status)) == -1) {
|
||||
fprintf(stderr, "Could not wait.(pipa)\n");
|
||||
exit(1);
|
||||
}
|
||||
if((wait(&status)) == -1) {
|
||||
fprintf(stderr, "Could not wait.(pipa)\n");
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*Hanterar semikolon, Kör vänster-delen om
|
||||
semikolonet, och när det är klart körs högerdelen*/
|
||||
void semi(treePtr tPtr) {
|
||||
int status;
|
||||
switch(fork()) {
|
||||
case -1: fprintf(stderr, "Fork failed. (semi)\n");break;
|
||||
case 0 : doTree(tPtr->left); /* Child */
|
||||
exit(1);
|
||||
break;
|
||||
default: if((wait(&status)) == -1) { /* Parent */
|
||||
fprintf(stderr, "Could not wait.(semi)\n");
|
||||
exit(-1);
|
||||
}
|
||||
if(tPtr->right)
|
||||
doTree(tPtr->right);
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*Ställer om utmatningsfil från STDOUT till utfil
|
||||
Om filen finns, trunkeras den*/
|
||||
void great(treePtr tPtr) {
|
||||
int fd, status;
|
||||
if((fd=open(symTable[tPtr->right->index],O_CREAT|O_TRUNC|O_WRONLY, PERMS))==-1) {
|
||||
fprintf(stderr, "Could not open file. (great)\n");
|
||||
exit(1);
|
||||
}
|
||||
switch(fork()) {
|
||||
case -1: fprintf(stderr, "Fork failed\n"); break;
|
||||
case 0 : if((dup2(fd, 1)) == -1) { /* Child */
|
||||
fprintf(stderr, "Could not dup. (great)\n");
|
||||
exit(1);
|
||||
}
|
||||
doTree(tPtr->left);
|
||||
exit(1); break;
|
||||
default: if((wait(&status)) == -1) { /* Parent */
|
||||
fprintf(stderr, "Could not wait. (great)\n");
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if((close(fd)) == -1) {
|
||||
fprintf(stderr, "Could not close file. (great)\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
/*Ställer om indirigering från STDIN till fil*/
|
||||
void less(treePtr tPtr) {
|
||||
int fd, status;
|
||||
if((fd=open(symTable[tPtr->right->index], O_RDONLY, PERMS))==-1){
|
||||
fprintf(stderr, "Could not open file (less)\n");
|
||||
return;
|
||||
}
|
||||
switch(fork()) {
|
||||
case -1: fprintf(stderr, "Fork failed\n"); break;
|
||||
case 0 : if((dup2(fd, 0)) == -1) { /* Child */
|
||||
fprintf(stderr, "Could not dup.(less)\n");
|
||||
exit(1);
|
||||
}
|
||||
doTree(tPtr->left);
|
||||
exit(1); break;
|
||||
default: if((wait(&status)) == -1) { /* Parent */
|
||||
fprintf(stderr, "Could not wait.(less)\n");
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if((close(fd)) == -1) {
|
||||
fprintf(stderr, "Could not close file.(less)\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
/*Kör processer utan att de behöver invänta den andre*/
|
||||
void and(treePtr tPtr) {
|
||||
int status;
|
||||
switch(fork()) {
|
||||
case -1: fprintf(stderr, "Fork failed. (and)\n");break;
|
||||
case 0: if(tPtr->left) doTree(tPtr->left); /* Child */
|
||||
exit(0);
|
||||
break;
|
||||
default: if(tPtr->right) doTree(tPtr->right); /* Parent */
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*Ställer om utmatningsfil från STDOUT till utfil
|
||||
Om filen finns, appendas den*/
|
||||
void dblarr(treePtr tPtr) {
|
||||
int fd, status;
|
||||
if((fd=open(symTable[tPtr->right->index],O_CREAT|O_APPEND|O_WRONLY, PERMS))==-1) {
|
||||
fprintf(stderr, "Could not open file. (dblarr)\n");
|
||||
exit(1);
|
||||
}
|
||||
switch(fork()) {
|
||||
case -1: fprintf(stderr, "Fork failed\n"); break;
|
||||
case 0: if((dup2(fd, 1)) == -1) {
|
||||
fprintf(stderr, "Could not dup. (dblarr)\n");
|
||||
exit(1);
|
||||
}
|
||||
doTree(tPtr->left);
|
||||
exit(1); break;
|
||||
default: if((wait(&status)) == -1) {
|
||||
fprintf(stderr, "Could not wait. (dblarr)\n");
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if((close(fd)) == -1) {
|
||||
fprintf(stderr, "Could not close file. (dblarr)\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
}
|
||||
/*Anropar rätt funktion beroende på metatecken*/
|
||||
void doTree(treePtr tPtr) {
|
||||
if(tPtr->nodeType == 0) cmd(tPtr);
|
||||
if(tPtr->nodeType == PIPE) pipa(tPtr);
|
||||
if(tPtr->nodeType == SEMI) semi(tPtr);
|
||||
if(tPtr->nodeType == GREAT) great(tPtr);
|
||||
if(tPtr->nodeType == LESS) less(tPtr);
|
||||
if(tPtr->nodeType == AND) and(tPtr);
|
||||
if(tPtr->nodeType == DBLARR) dblarr(tPtr);
|
||||
delTable();
|
||||
}
|
||||
/*Anropar Lex och Yacc med yyparse och sedan exeveras trädet*/
|
||||
int main() {
|
||||
signal(SIGTERM, SIG_IGN);
|
||||
signal(SIGKILL, SIG_IGN);
|
||||
signal(SIGCHLD,SIG_IGN);
|
||||
signal(SIGINT,SIG_IGN);
|
||||
system("clear");
|
||||
write(1, "Welcome to WARPshell 1.0\n",26);
|
||||
while(1) {
|
||||
fflush(stdout);
|
||||
write(1,"C:\\> ",5);
|
||||
yyparse();
|
||||
if(tree) doTree(tree);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
34
Lab2/lab2.h
Normal file
34
Lab2/lab2.h
Normal file
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Laboration 2 i C och UNIX
|
||||
*
|
||||
* Komplett shell
|
||||
* =========================================
|
||||
*
|
||||
* Christian Ohlsson, di7chro@cse.kau.se
|
||||
* Stefan Sonesson, di7stes@cse.kau.se
|
||||
*
|
||||
* Karlstads Universitet, 991209
|
||||
*
|
||||
*
|
||||
*===========================================
|
||||
*/
|
||||
#define SYMTBLSIZE 100
|
||||
#define PERMS 0644
|
||||
|
||||
#include <sys/wait.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include "tree.h"
|
||||
#include "y.tab.h"
|
||||
|
||||
void doTree(treePtr tPtr);
|
||||
void pipa(treePtr tPtr);
|
||||
void semi(treePtr tPtr);
|
||||
void great(treePtr tPtr);
|
||||
void less(treePtr tPtr);
|
||||
void and(treePtr tPtr);
|
||||
void dblarr(treePtr tPtr);
|
||||
|
||||
35
Lab2/lexer.l
Normal file
35
Lab2/lexer.l
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Laboration 2 i C och UNIX
|
||||
*
|
||||
* Komplett shell
|
||||
* =========================================
|
||||
*
|
||||
* Christian Ohlsson, di7chro@cse.kau.se
|
||||
* Stefan Sonesson, di7stes@cse.kau.se
|
||||
*
|
||||
* Karlstads Universitet, 991209
|
||||
*
|
||||
*
|
||||
*===========================================
|
||||
*/
|
||||
%{
|
||||
#include "tree.h"
|
||||
#include "y.tab.h"
|
||||
%}
|
||||
|
||||
WORD [a-zA-Z0-9_\-\./\*]+
|
||||
|
||||
%%
|
||||
[ \t]+ {/*Käkar upp white-space*/}
|
||||
"\n" { insert(NULL); return NL;}
|
||||
"&" { insert(NULL); return AND;}
|
||||
"|" { insert(NULL); return PIPE;}
|
||||
";" { insert(NULL); return SEMI;}
|
||||
">" { insert(NULL); return GREAT;}
|
||||
"<" { insert(NULL); return LESS;}
|
||||
">>" { insert(NULL); return DBLARR;}
|
||||
"exit" { printf("OK, use the other stinky shell then...\n");exit(0);}
|
||||
{WORD} { yylval.txt=insert(yytext);return WORD;}
|
||||
. { fprintf(stderr,"What?\n",6);}
|
||||
%%
|
||||
|
||||
57
Lab2/parser.y
Normal file
57
Lab2/parser.y
Normal file
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Laboration 2 i C och UNIX
|
||||
*
|
||||
* Komplett shell
|
||||
* =========================================
|
||||
*
|
||||
* Christian Ohlsson, di7chro@cse.kau.se
|
||||
* Stefan Sonesson, di7stes@cse.kau.se
|
||||
*
|
||||
* Karlstads Universitet, 991209
|
||||
*
|
||||
*
|
||||
*===========================================
|
||||
*/
|
||||
%{
|
||||
#include <stdio.h>
|
||||
#include "tree.h"
|
||||
extern treePtr tree;
|
||||
%}
|
||||
|
||||
%union {
|
||||
int txt;
|
||||
treePtr tPtr;
|
||||
};
|
||||
|
||||
%token NL PIPE SEMI GREAT LESS AND DBLARR EXIT
|
||||
%token<txt> WORD OPT
|
||||
%type<tPtr> rad ccmd scmd cmd
|
||||
|
||||
%start rad
|
||||
|
||||
%%
|
||||
rad : ccmd NL { tree=$1; return 0;}
|
||||
| NL { return 1;}
|
||||
;
|
||||
ccmd : ccmd PIPE scmd { $$=(treePtr)makeNode(PIPE, $1, $3); }
|
||||
| ccmd AND { $$=(treePtr)makeNode(AND, $1, NULL); }
|
||||
| ccmd SEMI scmd { $$=(treePtr)makeNode(SEMI, $1, $3); }
|
||||
| ccmd SEMI { $$=(treePtr)makeNode(SEMI, $1, NULL);}
|
||||
| scmd { $$=$1;}
|
||||
;
|
||||
scmd : scmd GREAT WORD { $$=(treePtr)makeNode(GREAT, $1, makeLeaf($3));}
|
||||
| scmd DBLARR WORD { $$=(treePtr)makeNode(DBLARR, $1, makeLeaf($3));}
|
||||
| scmd LESS WORD { $$=(treePtr)makeNode(LESS, $1, makeLeaf($3));}
|
||||
| cmd { $$=$1;}
|
||||
| error { $$=NULL;}
|
||||
;
|
||||
cmd : cmd WORD { $$=$1;}
|
||||
| WORD { $$=(treePtr)makeLeaf($1);}
|
||||
;
|
||||
%%
|
||||
|
||||
int yyerror() {
|
||||
fprintf(stderr, "\nSyntax error\n");
|
||||
tree=NULL;
|
||||
return 0;
|
||||
}
|
||||
6
Lab2/read_me
Normal file
6
Lab2/read_me
Normal file
@@ -0,0 +1,6 @@
|
||||
Laboration 2 i C och UNIX
|
||||
Komplett Shell
|
||||
Christian Ohlsson, di7chro@cse.kau.se
|
||||
Karlstads Universitet 991209
|
||||
|
||||
Labben är provkörd och klar!
|
||||
50
Lab2/tree.c
Normal file
50
Lab2/tree.c
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Laboration 2 i C och UNIX
|
||||
*
|
||||
* Komplett shell
|
||||
* =========================================
|
||||
*
|
||||
* Christian Ohlsson, di7chro@cse.kau.se
|
||||
* Stefan Sonesson, di7stes@cse.kau.se
|
||||
*
|
||||
* Karlstads Universitet, 991209
|
||||
*
|
||||
*
|
||||
*===========================================
|
||||
*/
|
||||
#include "tree.h"
|
||||
|
||||
treePtr tree=NULL;
|
||||
extern char *symTable[];
|
||||
|
||||
/*Skapar en nod med ett visst metatecken*/
|
||||
treePtr makeNode(int op,treePtr left,treePtr right) {
|
||||
treePtr tmp = malloc(sizeof(treeNode));
|
||||
tmp->nodeType = op;
|
||||
tmp->index = -1;
|
||||
tmp->right = right;
|
||||
tmp->left = left;
|
||||
return tmp;
|
||||
}
|
||||
/*Skapar ett löv som innehåller ett kommando*/
|
||||
treePtr makeLeaf(int index) {
|
||||
treePtr tmp = malloc(sizeof(treeNode));
|
||||
tmp->nodeType = 0;
|
||||
tmp->index = index;
|
||||
tmp->right = tmp->left = NULL;
|
||||
return tmp;
|
||||
}
|
||||
/*Skriver ut trädet på skärmen*/
|
||||
void printTree(treePtr tPtr){
|
||||
char str[10];
|
||||
if(tPtr == NULL) ;
|
||||
else{
|
||||
if(!tPtr->nodeType) /*Om det är ett löv...(kommando eller arg)*/
|
||||
sprintf(str,"%s---%d",symTable[tPtr->index],tPtr->nodeType);
|
||||
else /*Vi har ett metatecken!*/
|
||||
sprintf(str,"%d",tPtr->nodeType);
|
||||
puts(str);
|
||||
printTree(tPtr->left);
|
||||
printTree(tPtr->right);
|
||||
}
|
||||
}
|
||||
31
Lab2/tree.h
Normal file
31
Lab2/tree.h
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Laboration 2 i C och UNIX
|
||||
*
|
||||
* Komplett shell
|
||||
* =========================================
|
||||
*
|
||||
* Christian Ohlsson, di7chro@cse.kau.se
|
||||
* Stefan Sonesson, di7stes@cse.kau.se
|
||||
*
|
||||
* Karlstads Universitet, 991209
|
||||
*
|
||||
*
|
||||
*===========================================
|
||||
*/
|
||||
#ifndef _TREE_H
|
||||
#define _TREE_H
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
extern char *symTable[];
|
||||
/*Nod som finns i trädet*/
|
||||
typedef struct node{
|
||||
int nodeType;
|
||||
int index;
|
||||
struct node* left;
|
||||
struct node* right;
|
||||
}treeNode;
|
||||
|
||||
typedef treeNode *treePtr;
|
||||
|
||||
#endif
|
||||
224
Lab3/cgi-bin/entries.html
Normal file
224
Lab3/cgi-bin/entries.html
Normal file
@@ -0,0 +1,224 @@
|
||||
<HTML>
|
||||
|
||||
<font face="arial, verdana, times" size=3>
|
||||
|
||||
<body bgcolor="#ffffff">
|
||||
|
||||
<h1>Guestbook entries</h1>
|
||||
|
||||
<a href="../guestbook.html">Back to form</a><br>
|
||||
|
||||
<br>
|
||||
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
<b>Time: </b> Thu Dec 2 11:53:17 1999 <br>
|
||||
|
||||
<b>Full name: </b> Christian Ohlsson <br>
|
||||
|
||||
<b>Mailadress: </b><a href="mailto:di7chro@cse.kau.se">di7chro@cse.kau.se</a> <br>
|
||||
|
||||
<b>Homepage: </b><a href="http://www.cse.kau.se/~di7chro">http://www.cse.kau.se/~di7chro</a><br>
|
||||
|
||||
<b>Message: </b> Hejsan och mycket varmt välkommen till denna skojsiga
|
||||
|
||||
gästbok! Eftersom jag fullständigt stödjer OpenSource
|
||||
|
||||
finns koden på: http://www.cse.kau.se/~di7chro/
|
||||
|
||||
Klicka på Borland C++, C_och_UNIX, Lab2, cgi-bin. Filen
|
||||
|
||||
heter guestbook.cgi <br><i>Ha det gött!</i> <br>
|
||||
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
<b>Time: </b> Thu Dec 2 12:25:48 1999 <br>
|
||||
|
||||
<b>Full name: </b> Per-Ove Ringaby <br>
|
||||
|
||||
<b>Mailadress: </b><a href="mailto:peri@iname.com">peri@iname.com</a> <br>
|
||||
|
||||
<b>Homepage: </b><a href="http://www.kau.se/~di7perr">http://www.kau.se/~di7perr</a><br>
|
||||
|
||||
<b>Message: </b> Hej på dig <br>
|
||||
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
<b>Time: </b> Fri Dec 3 11:46:05 1999 <br>
|
||||
|
||||
<b>Full name: </b> Stefan Sonesson <br>
|
||||
|
||||
<b>Mailadress: </b><a href="mailto:di7stes@cse.kau.se">di7stes@cse.kau.se</a> <br>
|
||||
|
||||
<b>Homepage: </b><a href="http://surf.to/sone">http://surf.to/sone</a><br>
|
||||
|
||||
<b>Message: </b> SuperSone he's our man,<br>if he can't do it,<br>noone can. <br>
|
||||
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
<b>Time: </b> Fri Dec 3 14:58:28 1999 <br>
|
||||
|
||||
<b>Full name: </b> Mari <br>
|
||||
|
||||
<b>Mailadress: </b><a href="mailto:mari@techie.com">mari@techie.com</a> <br>
|
||||
|
||||
<b>Homepage: </b><a href="http://">http://</a><br>
|
||||
|
||||
<b>Message: </b> Live long and prosper... <br>
|
||||
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
<b>Time: </b> Fri Dec 3 15:02:14 1999 <br>
|
||||
|
||||
<b>Full name: </b> Jessica <br>
|
||||
|
||||
<b>Mailadress: </b><a href="mailto:Jessica@puuh.com">Jessica@puuh.com</a> <br>
|
||||
|
||||
<b>Homepage: </b><a href="http://">http://</a><br>
|
||||
|
||||
<b>Message: </b> Tjena chrillan! <br>
|
||||
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
<b>Time: </b> Sat Dec 4 19:20:40 1999 <br>
|
||||
|
||||
<b>Full name: </b> kaffepiller <br>
|
||||
|
||||
<b>Mailadress: </b><a href="mailto:kaffepiller@blåkaffepiller.kaffepiller">kaffepiller@blåkaffepiller.kaffepiller</a> <br>
|
||||
|
||||
<b>Homepage: </b><a href="http://">http://</a><br>
|
||||
|
||||
<b>Message: </b> ta kaffepiller <br>
|
||||
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
<b>Time: </b> Mon Dec 6 12:45:26 1999 <br>
|
||||
|
||||
<b>Full name: </b> Stefan Pettersson <br>
|
||||
|
||||
<b>Mailadress: </b><a href="mailto:cool_eddy@hotmail.com">cool_eddy@hotmail.com</a> <br>
|
||||
|
||||
<b>Homepage: </b><a href="http://">http://</a><br>
|
||||
|
||||
<b>Message: </b> Jag tycker att Dia Psalma "rules" med sin första skiva.
|
||||
|
||||
Har inte hört dom andra så jag kan inte säga nåt om dom. <br>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
<b>Time: </b> Mon Dec 6 18:47:33 1999 <br>
|
||||
|
||||
<b>Full name: </b> Patric Nilsson <br>
|
||||
|
||||
<b>Mailadress: </b><a href="mailto:biltjuv@hotmail.com">biltjuv@hotmail.com</a> <br>
|
||||
|
||||
<b>Homepage: </b><a href="come.to/romarea">come.to/romarea</a><br>
|
||||
|
||||
<b>Message: </b> Tja!
|
||||
|
||||
Bra sida!
|
||||
|
||||
skitbra men alla cd covers och tabs...
|
||||
|
||||
<br>
|
||||
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
<b>Time: </b> Tue Dec 7 14:38:12 1999 <br>
|
||||
|
||||
<b>Full name: </b> Fredri "The Unkmaister" Unkuri <br>
|
||||
|
||||
<b>Mailadress: </b><a href="mailto:Cluzake@hotmail.com">Cluzake@hotmail.com</a> <br>
|
||||
|
||||
<b>Homepage: </b><a href="http://www.????.???/????.se">http://www.????.???/????.se</a><br>
|
||||
|
||||
<b>Message: </b> Underbar hemsida fantastiskt skön
|
||||
|
||||
I LOVE DIA PSALMA <br>
|
||||
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
<b>Time: </b> Fri Dec 10 11:57:23 1999 <br>
|
||||
|
||||
<b>Full name: </b> Edyta Piasecka <br>
|
||||
|
||||
<b>Message: </b> vad skall jag skriva? Skall vi städa ..... ikväll?
|
||||
|
||||
<br>
|
||||
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
<b>Time: </b> Fri Dec 10 12:01:47 1999 <br>
|
||||
|
||||
<b>Full name: </b> Nicke <br>
|
||||
|
||||
<b>Mailadress: </b><a href="mailto:Niklas.Nikitin@kau.se">Niklas.Nikitin@kau.se</a> <br>
|
||||
|
||||
<b>Message: </b> Test <br>
|
||||
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
<b>Time: </b> Fri Dec 10 12:02:09 1999 <br>
|
||||
|
||||
<b>Full name: </b> Nicke (igen) <br>
|
||||
|
||||
<b>Mailadress: </b><a href="mailto:Niklas.Nikitin@kau.se">Niklas.Nikitin@kau.se</a> <br>
|
||||
|
||||
<b>Message: </b> Test <br>
|
||||
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
<b>Time: </b> Mon Dec 13 12:35:42 1999 <br>
|
||||
|
||||
<b>Full name: </b> Zvintolina <br>
|
||||
|
||||
<b>Mailadress: </b><a href="mailto:lucifers_bride@hotmail.com">lucifers_bride@hotmail.com</a> <br>
|
||||
|
||||
<b>Message: </b> AAAHHHH, Dia Psalma rules!! helt klart...fin sida, lite tom gästbok...men skitsamma. puzz till alla dia psalma fans
|
||||
|
||||
vi hörs!!!!! <br>
|
||||
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
<b>Time: </b> Fri Dec 17 02:17:12 1999 <br>
|
||||
|
||||
<b>Full name: </b> CP-åke - din vän <br>
|
||||
|
||||
<b>Mailadress: </b><a href="mailto:skit i det">skit i det</a> <br>
|
||||
|
||||
<b>Homepage: </b><a href="skit i det oxå">skit i det oxå</a><br>
|
||||
|
||||
<b>Message: </b> Fan du verkar ju totalt jävla sänkt. Speciellt med det här att du gillar "webdesign". För det första kan du ju ingenting, för det andra sitter din smak uppstoppad långt upp i röven. SKÄRPNING! <br>
|
||||
|
||||
|
||||
|
||||
74
Lab3/cgi-bin/guestbook.cgi
Normal file
74
Lab3/cgi-bin/guestbook.cgi
Normal file
@@ -0,0 +1,74 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# ###############################################
|
||||
#
|
||||
# Laboration 3 i C & UNIX
|
||||
# Gästbok skriven i Perl
|
||||
#
|
||||
# Christian Ohlsson, di7chro@cse.kau.se
|
||||
# Karlstads Universitet 991123
|
||||
#
|
||||
# ###############################################
|
||||
|
||||
#Initiera CGI-hanteringen
|
||||
use CGI;
|
||||
$query = new CGI;
|
||||
|
||||
#Hämta parametrar från formuläret
|
||||
$namn=$query->param('namn');
|
||||
$mailAdress=$query->param('mailAdress');
|
||||
$homePage=$query->param('homePage');
|
||||
$msg=$query->param('msg');
|
||||
|
||||
#Hämta in tiden då besöket gjordes
|
||||
$tid=localtime(time);
|
||||
|
||||
#Filen med gästboks-inskrivningarna
|
||||
$fileName="entries.html";
|
||||
|
||||
#Berätta för web-servern att HTML kod kommer
|
||||
print "Content-type:text/html\n\n";
|
||||
|
||||
#Skriv ut inmatade värden på skärmen
|
||||
|
||||
print "<html><body bgcolor=\"#ffffff\">\n";
|
||||
print "<font face=\"arial, verdana, times\" size=3>\n";
|
||||
unless ($namn) {
|
||||
print "<h3>You must enter your name!</h3>\n".
|
||||
"<a href=\"../guestbook.html\">Back to form</a></html>\n";
|
||||
die("Quitting...\n");
|
||||
}
|
||||
print "<h1> The following were entered:</h1>\n";
|
||||
print "<b> Time: </b> $tid <br>\n";
|
||||
print "<b> Full name: </b> $namn <br>\n";
|
||||
print "<b> Mailadress:</b> <a href=\"mailto:$mailAdress\">$mailAdress</a><br>\n";
|
||||
print "<b> Homepage: </b> <a href=\"$homePage\">$homePage</a><br>\n";
|
||||
print "<b> Message: </b> $msg\n";
|
||||
print "<br><br><a href=\"$fileName\">Look at it</a><br>\n";
|
||||
print "</html>\n";
|
||||
|
||||
#Öppna filen
|
||||
unless (open(UT, ">> $fileName")) {
|
||||
print "Error, cannot open file $fileName\n";
|
||||
close(UT);
|
||||
die("Error opening file\n");
|
||||
}
|
||||
|
||||
#Skriv data i fil
|
||||
print UT "\n<hr>\n";
|
||||
print UT "<b>Time: </b> $tid <br>\n";
|
||||
print UT "<b>Full name: </b> $namn <br>\n";
|
||||
if ($mailAdress) {
|
||||
print UT "<b>Mailadress: </b>";
|
||||
print UT "<a href=\"mailto:$mailAdress\">$mailAdress";
|
||||
print UT "</a> <br>\n";}
|
||||
if ($homePage) {
|
||||
print UT "<b>Homepage: </b>";
|
||||
print UT "<a href=\"$homePage\">$homePage</a><br>\n"; }
|
||||
if ($msg) {
|
||||
print UT "<b>Message: </b> $msg <br>\n"; }
|
||||
|
||||
#Stäng filen
|
||||
close(UT);
|
||||
|
||||
|
||||
26
Lab3/guestbook.html
Normal file
26
Lab3/guestbook.html
Normal file
@@ -0,0 +1,26 @@
|
||||
<html>
|
||||
|
||||
<body bgcolor="#ffffff" text="#000000">
|
||||
|
||||
<h2>Sign my guestbook !</h2><br>
|
||||
|
||||
<form action="cgi-bin/guestbook.cgi" method="GET">
|
||||
|
||||
<table border=0 cellpadding=1 cellspacing=1>
|
||||
|
||||
<tr>
|
||||
|
||||
<td valign=middle bgcolor="#eeeeee"><b>Full name:</b> </td>
|
||||
|
||||
<td><input type="text" name="namn" size=40> *</td>
|
||||
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
|
||||
<td valign=middle bgcolor="#eeeeee"><b>Mailadress:</b> </td>
|
||||
|
||||
<td><input type=text" name="mailAdress" size=40></td>
|
||||
|
||||
</tr>
|
||||
|
||||
BIN
Lab4/datafile
Normal file
BIN
Lab4/datafile
Normal file
Binary file not shown.
38
Lab4/db.h
Normal file
38
Lab4/db.h
Normal file
@@ -0,0 +1,38 @@
|
||||
#ifndef __DB_H__
|
||||
#define __DB_H__
|
||||
|
||||
#define NAMESIZE 30
|
||||
#define NRSIZE 10
|
||||
#define ACK 0
|
||||
#define ADD 1
|
||||
#define DEL 2
|
||||
#define NR 3
|
||||
#define NAME 4
|
||||
#define EXIT 5
|
||||
#define PRN 6
|
||||
#define NACK 9
|
||||
|
||||
#define FILENAME "datafile"
|
||||
#define TMPFILE "tmpfile"
|
||||
#define READLOCK ".rlock"
|
||||
#define WRITELOCK ".wlock"
|
||||
#define PERMS 0666
|
||||
|
||||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/stat.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netdb.h>
|
||||
|
||||
typedef struct msg{
|
||||
int op; /* The type of operation */
|
||||
char nr[NRSIZE]; /* Telephone number */
|
||||
char name[NAMESIZE]; /* The name */
|
||||
}msg;
|
||||
|
||||
typedef msg *msgPtr;
|
||||
|
||||
#endif
|
||||
146
Lab4/dbclient.c
Normal file
146
Lab4/dbclient.c
Normal file
@@ -0,0 +1,146 @@
|
||||
|
||||
#include "db.h"
|
||||
|
||||
void addNumber(msg *myMsg){
|
||||
char nr[NRSIZE], name[NAMESIZE];
|
||||
printf("ADD \n============\n");
|
||||
printf("Enter number: "); gets(nr);
|
||||
printf("Enter name: "); gets(name);
|
||||
myMsg->op = ADD;
|
||||
strcpy(myMsg->nr, nr);
|
||||
strcpy(myMsg->name, name);
|
||||
}
|
||||
|
||||
void delNumber(msg *myMsg) {
|
||||
char nr[NRSIZE];
|
||||
printf("Delete \n=============\n");
|
||||
printf("Enter number: "); gets(nr);
|
||||
myMsg->op = DEL;
|
||||
strcpy(myMsg->nr, nr);
|
||||
strcpy(myMsg->name, "");
|
||||
}
|
||||
|
||||
void findNumber(msg *myMsg) {
|
||||
char name[NAMESIZE];
|
||||
printf("Find \n=============\n");
|
||||
printf("Enter name: "); gets(name);
|
||||
myMsg->op = NR;
|
||||
strcpy(myMsg->nr, "");
|
||||
strcpy(myMsg->name, name);
|
||||
}
|
||||
|
||||
void findName(msg *myMsg) {
|
||||
char nr[NRSIZE];
|
||||
printf("Find \n=============\n");
|
||||
printf("Enter number: "); gets(nr);
|
||||
myMsg->op = NAME;
|
||||
strcpy(myMsg->nr, nr);
|
||||
strcpy(myMsg->name, "");
|
||||
}
|
||||
|
||||
void getOut(msg *myMsg, int sock) {
|
||||
printf("Quitting...\n===============\n");
|
||||
myMsg->op = EXIT;
|
||||
write(sock, myMsg, sizeof(myMsg));
|
||||
close(sock);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void printMsg(msg myMsg) {
|
||||
printf("myMsg.nr = %s\n", myMsg.nr);
|
||||
printf("myMsg.name = %s\n", myMsg.name);
|
||||
sleep(2);
|
||||
}
|
||||
|
||||
void menu(msg *myMsg, int sock) {
|
||||
char choice[5];
|
||||
char val;
|
||||
|
||||
system("clear");
|
||||
|
||||
puts("\nWelcome to IPC, InternalPhonenumberCatalogue");
|
||||
puts("============================================\n\n");
|
||||
|
||||
puts("1 - Add a number\n");
|
||||
puts("2 - Delete a number\n");
|
||||
puts("3 - Find a number\n");
|
||||
puts("4 - Find a name\n");
|
||||
puts("5 - Exit\n\n");
|
||||
puts("Enter your choice: ");
|
||||
|
||||
fgets(choice, sizeof(choice), stdin);
|
||||
|
||||
switch(choice[0]){
|
||||
case '1': addNumber(myMsg);
|
||||
break;
|
||||
case '2': delNumber(myMsg);
|
||||
break;
|
||||
case '3': findNumber(myMsg);
|
||||
break;
|
||||
case '4': findName(myMsg);
|
||||
break;
|
||||
case '5': getOut(myMsg, sock);
|
||||
break;
|
||||
|
||||
default : puts("Try again <1-4 or 5>\n\n");
|
||||
sleep(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
main(int argc, char *argv[]) {
|
||||
char *remhost;
|
||||
u_short remport;
|
||||
int sock;
|
||||
struct sockaddr_in remote;
|
||||
struct hostent *h;
|
||||
msg myMsg;
|
||||
|
||||
if (argc != 3) {
|
||||
fprintf(stderr,"Usage: dbclient <host> <port>\n");
|
||||
exit(1);
|
||||
}
|
||||
remhost = argv[1];
|
||||
remport = atoi(argv[2]);
|
||||
|
||||
/* Create the socket. */
|
||||
if((sock = socket( AF_INET, SOCK_STREAM, 0 )) < 0 ) {
|
||||
perror("dbclient:socket");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
bzero((char *) &remote, sizeof(remote));
|
||||
remote.sin_family = AF_INET;
|
||||
if((h = gethostbyname(remhost)) == NULL) {
|
||||
perror("dbclient:gethostbyname");
|
||||
exit(1);
|
||||
}
|
||||
bcopy((char *)h->h_addr, (char *)&remote.sin_addr, h->h_length);
|
||||
remote.sin_port = htons(remport);
|
||||
|
||||
if(connect(sock, (struct sockaddr *)&remote, sizeof(remote)) < 0) {
|
||||
perror("dbclient:connect");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
for(;;) {
|
||||
menu(&myMsg, sock);
|
||||
write(sock, &myMsg, sizeof(myMsg));
|
||||
read(sock, &myMsg, sizeof(myMsg));/*lyssna efter svar från servern*/
|
||||
|
||||
if(myMsg.op == NACK) {
|
||||
puts("Could not execute your request, please try again");
|
||||
}
|
||||
else if(myMsg.op == ACK) {
|
||||
printf("Operation executed.\n");
|
||||
}
|
||||
else if(myMsg.op == PRN) {
|
||||
printMsg(myMsg);
|
||||
}
|
||||
sleep(2);
|
||||
}
|
||||
close(sock);
|
||||
}
|
||||
|
||||
|
||||
|
||||
247
Lab4/dbserver.c
Normal file
247
Lab4/dbserver.c
Normal file
@@ -0,0 +1,247 @@
|
||||
#include "db.h"
|
||||
|
||||
void Kill_Process() {
|
||||
kill(0, SIGTERM);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void P(char *lockfile) { /* Proberen */
|
||||
int tempfd;
|
||||
while((tempfd = creat(lockfile, 0)) < 0); /* Försök skapa låsfilen */
|
||||
close(tempfd);
|
||||
}
|
||||
|
||||
void V(char *lockfile) { /* Verhogen */
|
||||
unlink(lockfile);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
void doAdd(msg *myMsg) {
|
||||
int fd, i=0;
|
||||
printf("Adding %s\n", myMsg->name);
|
||||
|
||||
P(READLOCK);
|
||||
if((fd = open(FILENAME, O_CREAT|O_WRONLY|O_APPEND, PERMS)) < 0) {
|
||||
myMsg->op = NACK; /* Return error to client */
|
||||
exit(1);
|
||||
}
|
||||
write(fd, &myMsg->nr, NRSIZE);
|
||||
write(fd, &myMsg->name, NAMESIZE);
|
||||
|
||||
if((close(fd)) < 0) {
|
||||
myMsg->op = NACK;
|
||||
V(READLOCK);
|
||||
return;
|
||||
}
|
||||
myMsg->op = ACK;
|
||||
V(READLOCK);
|
||||
}
|
||||
|
||||
void doDel(msg *myMsg) {
|
||||
int i=0, j=0, file, temp;
|
||||
struct stat st1;
|
||||
struct stat st2;
|
||||
long a, b;
|
||||
char c, nr[NRSIZE], name[NAMESIZE];
|
||||
|
||||
P(READLOCK);
|
||||
P(WRITELOCK);
|
||||
if((file = open(FILENAME, O_RDONLY)) < 0) {
|
||||
myMsg->op = NACK;
|
||||
return;
|
||||
}
|
||||
if((temp = open(TMPFILE, O_RDWR|O_CREAT|O_TRUNC, PERMS)) < 0) {
|
||||
myMsg->op = NACK;
|
||||
return;
|
||||
}
|
||||
|
||||
while(read(file, nr, NRSIZE) > 0) {
|
||||
read(file, name, NAMESIZE);
|
||||
if(strcmp(nr, myMsg->nr) != 0) {
|
||||
write(temp, nr, NRSIZE);
|
||||
write(temp, name, NAMESIZE);
|
||||
}
|
||||
}
|
||||
fstat(file, &st1);
|
||||
a = st1.st_size;
|
||||
fstat(temp, &st2);
|
||||
b = st2.st_size;
|
||||
|
||||
if((close(file)) < 0) {
|
||||
myMsg->op = NACK;
|
||||
return;
|
||||
}
|
||||
if((close(temp)) < 0) {
|
||||
myMsg->op = NACK;
|
||||
return;
|
||||
}
|
||||
if((temp = open(TMPFILE, O_RDONLY)) < 0) {
|
||||
myMsg->op = NACK;
|
||||
return;
|
||||
}
|
||||
if((file = open(FILENAME, O_RDWR|O_CREAT|O_TRUNC, PERMS)) < 0) {
|
||||
myMsg->op = NACK;
|
||||
return;
|
||||
}
|
||||
|
||||
while(read(temp, &c ,1) > 0){
|
||||
write(file, &c, 1);
|
||||
}
|
||||
if((close(file)) < 0) {
|
||||
myMsg->op = NACK;
|
||||
return;
|
||||
}
|
||||
if((close(temp)) < 0) {
|
||||
myMsg->op = NACK;
|
||||
return;
|
||||
}
|
||||
if((unlink(TMPFILE)) < 0) {
|
||||
myMsg->op = NACK;
|
||||
return;
|
||||
}
|
||||
V(WRITELOCK);
|
||||
V(READLOCK);
|
||||
|
||||
if(a == b) {
|
||||
myMsg->op = NACK;
|
||||
return;
|
||||
}
|
||||
myMsg->op = ACK;
|
||||
}
|
||||
|
||||
void doFindNumber(msg *myMsg) {
|
||||
int file;
|
||||
char nr[NRSIZE], name[NAMESIZE];
|
||||
|
||||
P(READLOCK);
|
||||
if((file = open(FILENAME, O_RDONLY)) < 0) {
|
||||
myMsg->op = NACK;
|
||||
return;
|
||||
}
|
||||
|
||||
while(read(file, nr, NRSIZE) > 0){
|
||||
read(file, name, NAMESIZE);
|
||||
if(strcmp(name, myMsg->name) == 0) {
|
||||
myMsg->op = PRN;
|
||||
strcpy(myMsg->nr, nr);
|
||||
V(READLOCK);
|
||||
return;
|
||||
}
|
||||
}
|
||||
myMsg->op = NACK;
|
||||
close(file);
|
||||
V(READLOCK);
|
||||
return;
|
||||
}
|
||||
|
||||
void doFindName(msg *myMsg) {
|
||||
int file;
|
||||
char nr[NRSIZE], name[NAMESIZE];
|
||||
|
||||
P(READLOCK);
|
||||
if((file = open(FILENAME, O_RDONLY)) < 0) {
|
||||
myMsg->op = NACK;
|
||||
return;
|
||||
}
|
||||
|
||||
while(read(file, nr, NRSIZE) > 0){
|
||||
read(file, name, NAMESIZE);
|
||||
printf("\n nr=%s, myMsg->nr=%s",nr, myMsg->nr);
|
||||
if(strcmp(nr, myMsg->nr) == 0) {
|
||||
myMsg->op = PRN;
|
||||
strcpy(myMsg->name, name);
|
||||
V(READLOCK);
|
||||
return;
|
||||
}
|
||||
}
|
||||
close(file);
|
||||
V(READLOCK);
|
||||
myMsg->op = NACK;
|
||||
}
|
||||
|
||||
void doExit(msg *myMsg, int data_sockfd) {
|
||||
printf("Quitting...\n");
|
||||
close(data_sockfd);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
main() {
|
||||
int listener, childpid, data_sockfd, status, client_length, length;
|
||||
msg myMsg;
|
||||
struct sockaddr_in srvr_addr, client_addr;
|
||||
signal(SIGCHLD, SIG_IGN);
|
||||
signal(SIGINT, Kill_Process);
|
||||
/*signal(SIGTERM, Kill_Process);*/
|
||||
|
||||
if((listener = socket( AF_INET, SOCK_STREAM, 0 )) < 0 ) {
|
||||
perror("server: can't open stream socket");
|
||||
exit(0);
|
||||
}
|
||||
bzero((char *) &srvr_addr, sizeof(srvr_addr));
|
||||
srvr_addr.sin_family = AF_INET;
|
||||
srvr_addr.sin_addr.s_addr = htons(INADDR_ANY);
|
||||
srvr_addr.sin_port = 27015;
|
||||
|
||||
if(bind(listener, (struct sockaddr *)&srvr_addr, sizeof(srvr_addr)) < 0) {
|
||||
perror("server: can't bind local address");
|
||||
exit(0);
|
||||
}
|
||||
/* Print out the port number assigned to this process by bind(). */
|
||||
length = sizeof(srvr_addr);
|
||||
|
||||
if(getsockname(listener, (struct sockaddr *)&srvr_addr, &length) < 0) {
|
||||
perror("server: can't get sockname");
|
||||
exit(0);
|
||||
}
|
||||
printf("Port number %d\n", ntohs(srvr_addr.sin_port));
|
||||
listen(listener,10);
|
||||
|
||||
for(;;) {
|
||||
/* Wait for a connection from a client process */
|
||||
client_length = sizeof(client_addr);
|
||||
if ((data_sockfd=accept(listener,
|
||||
(struct sockaddr *)&client_addr, &length)) < 0) {
|
||||
perror("server: accept error");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
printsin(&client_addr,"\nRSTREAM", "accepted connection from");
|
||||
if((childpid = fork()) < 0) {
|
||||
perror("server: fork error");
|
||||
exit(0);
|
||||
}
|
||||
else if(childpid == 0) { /* Child process */
|
||||
close(listener);
|
||||
while(1) {
|
||||
read(data_sockfd, &myMsg, sizeof(myMsg));
|
||||
|
||||
switch(myMsg.op) {
|
||||
case 1: doAdd(&myMsg);
|
||||
write(data_sockfd, &myMsg, sizeof(myMsg));
|
||||
break;
|
||||
case 2: doDel(&myMsg);
|
||||
write(data_sockfd, &myMsg, sizeof(myMsg));
|
||||
break;
|
||||
case 3: doFindNumber(&myMsg);
|
||||
write(data_sockfd, &myMsg, sizeof(myMsg));
|
||||
break;
|
||||
case 4: doFindName(&myMsg);
|
||||
write(data_sockfd, &myMsg, sizeof(myMsg));
|
||||
break;
|
||||
case 5: doExit(&myMsg, data_sockfd);
|
||||
|
||||
default: break;
|
||||
}
|
||||
myMsg.op = ACK; /* töm struktens op så den inte är kvar till switchen */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
10
Lab4/read_me
Normal file
10
Lab4/read_me
Normal file
@@ -0,0 +1,10 @@
|
||||
Laboration 4 i C & UNIX
|
||||
========================================
|
||||
Databas med klient & server
|
||||
Starta servern, sedan klienten
|
||||
med portnumret du fick.
|
||||
|
||||
Labben är provkörd och klar.
|
||||
========================================
|
||||
Christian Ohlsson, di7chro@cse.kau.se
|
||||
|
||||
Reference in New Issue
Block a user