summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLAN-TW <lantw44@gmail.com>2013-10-12 21:33:05 +0800
committerLAN-TW <lantw44@gmail.com>2013-10-12 21:33:05 +0800
commit940e341c27f7219fa3a51687fd7157c045d1b12a (patch)
tree404e747307c1fa60c67932c323fb26e5a877d112
parent379af3b399c146eb0da4013c22e92808baebe595 (diff)
downloadsp2013-940e341c27f7219fa3a51687fd7157c045d1b12a.tar.gz
sp2013-940e341c27f7219fa3a51687fd7157c045d1b12a.tar.zst
sp2013-940e341c27f7219fa3a51687fd7157c045d1b12a.zip
HW1: 移除所有全域變數
-rw-r--r--hw1/main.c8
-rw-r--r--hw1/server.c35
-rw-r--r--hw1/server.h4
3 files changed, 22 insertions, 25 deletions
diff --git a/hw1/main.c b/hw1/main.c
index 9c7ecfd..6aad0c2 100644
--- a/hw1/main.c
+++ b/hw1/main.c
@@ -7,8 +7,6 @@
#include <string.h>
#include <unistd.h>
-request* requestP = NULL; // point to a list of requests
-int maxfd; // size of open file descriptor table, size of request list
int main(int argc, char** argv) {
if (argc != 2) {
@@ -25,12 +23,14 @@ int main(int argc, char** argv) {
sigaction(SIGPIPE, &pipe_action, NULL);
// Get file descripter table size
- maxfd = getdtablesize();
+ int maxfd = getdtablesize();
// Initialize server
- server_init((unsigned short) atoi(argv[1]), maxfd);
+ server svr; // server
+ server_init(&svr, (unsigned short) atoi(argv[1]), maxfd);
// Initialize request table
+ request* requestP = NULL; // point to a list of requests
requestP = (request*) e_malloc(sizeof(request) * maxfd);
for (int i = 0; i < maxfd; i++)
diff --git a/hw1/server.c b/hw1/server.c
index 45f18d1..b65bb10 100644
--- a/hw1/server.c
+++ b/hw1/server.c
@@ -18,19 +18,18 @@
#include <sys/types.h>
#include <unistd.h>
-server svr; // server
// You don't need to know how the following codes are working
-void server_init(unsigned short port, int maxfd) {
+void server_init(server* svr, unsigned short port, int maxfd) {
struct sockaddr_in servaddr;
int val, flags;
- gethostname(svr.hostname, sizeof(svr.hostname));
- svr.port = port;
+ gethostname(svr->hostname, sizeof(svr->hostname));
+ svr->port = port;
- svr.listen_fd = socket(AF_INET, SOCK_STREAM, 0);
- if (svr.listen_fd < 0)
+ svr->listen_fd = socket(AF_INET, SOCK_STREAM, 0);
+ if (svr->listen_fd < 0)
e_err_exit("socket");
memset(&servaddr, 0, sizeof(servaddr));
@@ -38,29 +37,29 @@ void server_init(unsigned short port, int maxfd) {
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(port);
val = 1;
- if (setsockopt(svr.listen_fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)) < 0)
+ if (setsockopt(svr->listen_fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)) < 0)
e_err_exit("setsockopt");
- if (bind(svr.listen_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
+ if (bind(svr->listen_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
e_err_exit("bind");
- if (listen(svr.listen_fd, 1024) < 0)
+ if (listen(svr->listen_fd, 1024) < 0)
e_err_exit("listen");
- strcpy(svr.accept_hdr, "ACCEPT\n");
- strcpy(svr.reject_hdr, "REJECT\n");
+ strcpy(svr->accept_hdr, "ACCEPT\n");
+ strcpy(svr->reject_hdr, "REJECT\n");
- FD_ZERO(&svr.readfds);
- FD_ZERO(&svr.writefds);
- FD_ZERO(&svr.exceptfds);
- FD_SET(svr.listen_fd, &svr.readfds);
+ FD_ZERO(&svr->readfds);
+ FD_ZERO(&svr->writefds);
+ FD_ZERO(&svr->exceptfds);
+ FD_SET(svr->listen_fd, &svr->readfds);
- flags = fcntl(svr.listen_fd, F_GETFL);
+ flags = fcntl(svr->listen_fd, F_GETFL);
if(flags < 0){
perror("Warning: F_GETFL");
return;
}
- fcntl(svr.listen_fd, F_SETFL, flags | O_NONBLOCK);
+ fcntl(svr->listen_fd, F_SETFL, flags | O_NONBLOCK);
- svr.file_table = ftab_create (maxfd);
+ svr->file_table = ftab_create (maxfd);
}
void request_init(request* reqP) {
diff --git a/hw1/server.h b/hw1/server.h
index c9de5e9..d519f4d 100644
--- a/hw1/server.h
+++ b/hw1/server.h
@@ -41,10 +41,8 @@ typedef struct {
int header_accept : 1; // used by procconn to know if ACCEPT/REJECT is sent
} request;
-extern server svr; // server
-
// initailize a server, exit for error
-void server_init (unsigned short port, int maxfd);
+void server_init (server* svr, unsigned short port, int maxfd);
// initailize a request instance
void request_init (request* reqP);