forked from papagryllos-productions/threading-pizza
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pizza_server.c
181 lines (163 loc) · 4.92 KB
/
pizza_server.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
/*
* George Papanikolaou - Prokopis Gryllos
* Operating Systems Project 2012 - Pizza Delivery
* There is absolutely no warranty
*
* status1 --- status2:
* 0 0 : Pending
* 0 1 : Cooking
* 1 0 : Cooked
* 1 1 : Delivering
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <semaphore.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/un.h>
/* Pizza default values */
#define TIME_MARGARITA 10
#define TIME_PEPPERONI 12
#define TIME_SPECIAL 15
#define T_KONTA 5
#define T_MAKRIA 10
#define T_VERYLONG 50
#define N_DIANOMEIS 10
#define N_PSISTES 10
#define N_MAXPIZZA 3
/* System values: key(maybe a key_t?), pizza limit, listen queue */
#define SHM_KEY 7942
#define LIMIT 200
#define QUEUE 5
#define PATH "socketfile"
/* Declaration of boolean type */
typedef enum { false, true } bool;
/* Struct for the pizza order */
typedef struct {
int m_num;
short p_num;
short s_num;
bool time;
bool status1;
bool status2;
} order_t;
/* A function to display an error message and then exit */
void fatal(char *message) {
fprintf(stderr, "\a!! - Fatal error - ");
fprintf(stderr, "%s\n", message);
exit(EXIT_FAILURE);
}
/* An error checked malloc() wrapper function */
void *ec_malloc(unsigned int size) {
void *ptr;
ptr = malloc(size);
if(ptr == NULL)
fatal("in ec_malloc() on memory allocation");
return ptr;
}
void handler(int sig_num) {
/* handling the Signal of the client SIGUSR1 (10) */
}
void cook() {
/* Cooker function */
}
void deliverer() {
/* Delivery function */
}
int main() {
pid_t pid;
/* socket file descriptors */
int sd, new_conn;
int shm_id, i;
/* calculating and initialising a buffer to get data from socket stream */
int ord_len = sizeof(order_t);
int temp[ord_len];
/* unix socket address declarations and lengths */
struct sockaddr_un server_addr, client_addr;
socklen_t addr_len;
/* order number limit + status buffers */
int size = LIMIT * sizeof(order_t) + 20;
/* Fork off the parent process to get into deamon mode */
pid = fork();
if (pid == -1)
fatal("Can't fork parent");
if (pid > 0) {
/* Stopping the parent proccess and just keeping the child */
printf(">> Deamon mode <<\n");
exit(EXIT_SUCCESS);
}
/* Shared memory allocation */
shm_id = shmget(SHM_KEY, size, 0600 | IPC_CREAT);
if (shm_id == -1)
fatal("in shared memory");
bool* shm_start = shmat(shm_id, NULL, 0);
if (shm_start == (bool *)-1)
fatal("main could not attach to shared memory");
/* Setting the pointers to memory */
bool* cook_status = shm_start;
bool* deliverer_status = shm_start + 10;
order_t* order_list = (order_t*)shm_start + 20;
for (i = 0; i < 20; i++) {
*(shm_start + i) = false;
}
/* Socket business */
sd = socket(PF_UNIX, SOCK_STREAM, 0);
if (sd == -1)
fatal("while creating server's socket");
unlink(PATH);
/* Zero all fields of servaddr. */
bzero(&server_addr, addr_len);
/* socket internal information --- Maybe: AF_LOCAL */
server_addr.sun_family = AF_UNIX;
/* Define the name of this socket */
strcpy(server_addr.sun_path, PATH);
/* bind function call with typecasted arguments of server address */
/* third argument may need to be sizeof(server_addr) */
if (bind (sd, (struct sockaddr *) &server_addr, addr_len) == -1)
fatal("while binding");
if (listen(sd, QUEUE) == -1)
fatal("while listening");
/* endless loop to get new connections */
while (1) {
addr_len = sizeof(struct sockaddr_un);
/* getting new connections from the client socket */
new_conn = accept(sd, (struct sockaddr *) &client_addr, &addr_len);
read(new_conn, &temp, sizeof(temp));
/* temp now has the order. closing connection... */
close(new_conn);
order_list->m_num = temp[0];
order_list->p_num = temp[1];
order_list->s_num = temp[2];
order_list->time = temp[3];
order_list->status1 = 0;
order_list->status2 = 0;
/* in order to save new order to next field */
order_list++;
pid = fork();
if (pid == 0)
break;
}
/* Child operates below */
/* configure shared memory for every child proccess */
shm_id = shmget(SHM_KEY, size , 0600);
if (shm_id == -1)
fatal("in shared memory");
/* Do we need to attach ??? */
/* shm_start = shmat(shm_id, NULL, 0); */
/* get in the oven */
cook(order_list);
/* get gone */
deliverer();
/* detaching from shared memory */
if (shmdt(shm_start) == -1)
fatal("order could not detach from shared memory");
/* terminate */
}