Skip to content

Commit 293171f

Browse files
committed
src files and vars.mk to debug makefile
1 parent 5907031 commit 293171f

File tree

13 files changed

+538
-0
lines changed

13 files changed

+538
-0
lines changed

src/a.out

14.2 KB
Binary file not shown.

src/blublu.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#ifndef _BLUBLU_H_
2+
#define _BLUBLU_H_
3+
4+
/* Head files */
5+
6+
/* Marcos, Types*/
7+
8+
9+
/* Persistent state for the robust I/O (Rio) package */
10+
11+
/* Globals*/
12+
13+
/* Functions*/
14+
15+
#endif /* _BLUBLU_H_*/

src/epoll.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#include <stdlib.h>
2+
#include "epoll.h"
3+
#include <stdio.h>
4+
#include "error.h"
5+
struct epoll_event *events;
6+
7+
int epoll_create(int flags) {
8+
int fd = epoll_create1(flags);
9+
10+
events = (struct epoll_event *)malloc(sizeof(struct epoll_event) * MAXEVENTS);
11+
return fd;
12+
}
13+
14+
void epoll_add(int epfd, int fd, struct epoll_event *event) {
15+
16+
epoll_ctl(epfd, EPOLL_CTL_ADD, fd, event);
17+
return;
18+
}
19+
20+
void epoll_mod(int epfd, int fd, struct epoll_event *event) {
21+
epoll_ctl(epfd, EPOLL_CTL_MOD, fd, event);
22+
return;
23+
}
24+
25+
void epoll_del(int epfd, int fd, struct epoll_event *event) {
26+
epoll_ctl(epfd, EPOLL_CTL_DEL, fd, event);
27+
return;
28+
}
29+
30+

src/epoll.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#ifndef _EPOLL_H_
2+
#define _EPOLL_H
3+
4+
#include <sys/epoll.h>
5+
6+
#define MAXEVENTS 1024
7+
8+
extern struct epoll_event *events;
9+
10+
int epoll_create(int flags);
11+
void epoll_add(int epfd, int fs, struct epoll_event *event);
12+
void epoll_mod(int epfd, int fs, struct epoll_event *event);
13+
void epoll_del(int epfd, int fs, struct epoll_event *event);
14+
//int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
15+
16+
#endif

src/error.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*******************************
2+
print error information
3+
Reference: CSAPP
4+
********************************/
5+
#include <stdio.h>
6+
#include <stdlib.h>
7+
#include <string.h>
8+
#include "error.h"
9+
10+
void unix_error(char *msg) /* Unix-style error */
11+
{
12+
fprintf(stderr, "%s: %s\n", msg, strerror(errno));
13+
exit(0);
14+
}
15+
16+
void posix_error(int code, char *msg) /* Posix-style error */
17+
{
18+
fprintf(stderr, "%s: %s\n", msg, strerror(code));
19+
exit(0);
20+
}

src/error.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#ifndef _ERROR_H_
2+
#define _ERROR_H_
3+
4+
#include <errno.h>
5+
void unix_error(char *msg);
6+
void posix_error(int code, char *msg);
7+
//void dns_error(char *msg);
8+
//void app_error(char *msg);
9+
10+
#endif

src/main.c

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/*
2+
* event_loop
3+
*/
4+
#include <stdio.h>
5+
#include <stdlib.h>
6+
#include <unistd.h>
7+
#include "blublu.h"
8+
#include "socket.h"
9+
#include "rio.h"
10+
#include "epoll.h"
11+
#include "error.h"
12+
13+
int main(int argc, char *argv[])
14+
{
15+
int epfd;
16+
int listenfd, connfd;
17+
int n, i;
18+
socklen_t addrlen;
19+
struct sockaddr_in clientaddr;
20+
struct epoll_event event;
21+
22+
printf("Welcome to BluBlu!\n");
23+
24+
addrlen = sizeof(clientaddr);
25+
listenfd = Open_listenfd(8080);
26+
make_socket_nblk(listenfd);
27+
epfd = epoll_create(0);
28+
printf("epfd = %d, listen fd = %d.\n", epfd, listenfd);
29+
event.data.fd = listenfd;
30+
event.events = EPOLLIN | EPOLLET;
31+
32+
epoll_add(epfd, listenfd, &event);
33+
34+
while (1) {
35+
n = epoll_wait(epfd, events, MAXEVENTS, -1);
36+
37+
for (i = 0; i < n; i++) {
38+
if ((events[i].events & EPOLLERR) ||
39+
(events[i].events & EPOLLHUP) ||
40+
(!(events[i].events & EPOLLIN))) {
41+
/* An error has occured on this fd, or the socket is not ready for reading */
42+
unix_error( "epoll error");
43+
close (events[i].data.fd);
44+
continue;
45+
} else if (events[i].data.fd == listenfd) {
46+
/* liseten fd */
47+
connfd = Accept(listenfd, (SA *)&clientaddr, &addrlen);
48+
if (connfd < 0)
49+
break; /* errno == EAGAIN) || (errno == EWOULDBLOCK) || other error, anyway, we break.*/
50+
else {
51+
/* handle new connection*/
52+
make_socket_nblk(listenfd);
53+
event.data.fd = listenfd;
54+
event.events = EPOLLIN | EPOLLET;
55+
epoll_add(epfd, listenfd, &event);
56+
/* TODO: handling*/
57+
}
58+
continue;
59+
} else {
60+
/* connected fd */
61+
/* read data and provide http service*/
62+
/* serve_client(client_fd)*/
63+
64+
continue;
65+
}
66+
67+
}
68+
69+
}
70+
free (events);
71+
close (listenfd);
72+
73+
return 0;
74+
}

src/rio.c

Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
/******************************************************************
2+
rio package - robust I/O functions
3+
Reference: CSAPP
4+
******************************************************************/
5+
6+
#include <unistd.h>
7+
#include <string.h>
8+
#include "rio.h"
9+
#include "error.h"
10+
/*
11+
* rio_readn - robustly read n bytes (unbuffered)
12+
*/
13+
ssize_t rio_readn(int fd, void *usrbuf, size_t n)
14+
{
15+
size_t nleft = n;
16+
ssize_t nread;
17+
char *bufp = usrbuf;
18+
19+
while (nleft > 0) {
20+
if ((nread = read(fd, (void *)bufp, nleft)) < 0) {
21+
if (errno == EINTR) /* Interrupted by sig handler return */
22+
nread = 0; /* and call read() again */
23+
else
24+
return -1; /* errno set by read() */
25+
}
26+
else if (nread == 0)
27+
break; /* EOF */
28+
nleft -= nread;
29+
bufp += nread;
30+
}
31+
return (n - nleft); /* return >= 0 */
32+
}
33+
34+
/*
35+
* rio_writen - robustly write n bytes (unbuffered)
36+
*/
37+
ssize_t rio_writen(int fd, void *usrbuf, size_t n)
38+
{
39+
size_t nleft = n;
40+
ssize_t nwritten;
41+
char *bufp = usrbuf;
42+
43+
while (nleft > 0) {
44+
if ((nwritten = write(fd, bufp, nleft)) <= 0) {
45+
if (errno == EINTR) /* Interrupted by sig handler return */
46+
nwritten = 0; /* and call write() again */
47+
else
48+
return -1; /* errno set by write() */
49+
}
50+
nleft -= nwritten;
51+
bufp += nwritten;
52+
}
53+
return n;
54+
}
55+
56+
57+
/*
58+
* rio_read - This is a wrapper for the Unix read() function that
59+
* transfers min(n, rio_cnt) bytes from an internal buffer to a user
60+
* buffer, where n is the number of bytes requested by the user and
61+
* rio_cnt is the number of unread bytes in the internal buffer. On
62+
* entry, rio_read() refills the internal buffer via a call to
63+
* read() if the internal buffer is empty.
64+
*/
65+
static ssize_t rio_read(rio_t *rp, char *usrbuf, size_t n)
66+
{
67+
int cnt;
68+
69+
while (rp->rio_cnt <= 0) { /* Refill if buf is empty */
70+
rp->rio_cnt = read(rp->rio_fd, rp->rio_buf, sizeof(rp->rio_buf));
71+
if (rp->rio_cnt < 0) {
72+
if (errno != EINTR) /* Interrupted by sig handler return */
73+
return -1;
74+
}
75+
else if (rp->rio_cnt == 0) /* EOF */
76+
return 0;
77+
else
78+
rp->rio_bufptr = rp->rio_buf; /* Reset buffer ptr */
79+
}
80+
81+
/* Copy min(n, rp->rio_cnt) bytes from internal buf to user buf */
82+
cnt = n;
83+
if (rp->rio_cnt < n)
84+
cnt = rp->rio_cnt;
85+
memcpy(usrbuf, rp->rio_bufptr, cnt);
86+
rp->rio_bufptr += cnt;
87+
rp->rio_cnt -= cnt;
88+
return cnt;
89+
}
90+
91+
/*
92+
* rio_readinitb - Associate a descriptor with a read buffer and reset buffer
93+
*/
94+
void rio_readinitb(rio_t *rp, int fd)
95+
{
96+
rp->rio_fd = fd;
97+
rp->rio_cnt = 0;
98+
rp->rio_bufptr = rp->rio_buf;
99+
}
100+
101+
/*
102+
* rio_readnb - Robustly read n bytes (buffered)
103+
*/
104+
ssize_t rio_readnb(rio_t *rp, void *usrbuf, size_t n)
105+
{
106+
size_t nleft = n;
107+
ssize_t nread;
108+
char *bufp = usrbuf;
109+
110+
while (nleft > 0) {
111+
if ((nread = rio_read(rp, bufp, nleft)) < 0)
112+
return -1; /* errno set by read() */
113+
else if (nread == 0)
114+
break; /* EOF */
115+
nleft -= nread;
116+
bufp += nread;
117+
}
118+
return (n - nleft); /* return >= 0 */
119+
}
120+
121+
/*
122+
* rio_readlineb - robustly read a text line (buffered)
123+
*/
124+
ssize_t rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen)
125+
{
126+
int n, rc;
127+
char c, *bufp = usrbuf;
128+
129+
for (n = 1; n < maxlen; n++) {
130+
if ((rc = rio_read(rp, &c, 1)) == 1) {
131+
*bufp++ = c;
132+
if (c == '\n') {
133+
n++;
134+
break;
135+
}
136+
} else if (rc == 0) {
137+
if (n == 1)
138+
return 0; /* EOF, no data read */
139+
else
140+
break; /* EOF, some data was read */
141+
} else
142+
return -1; /* Error */
143+
}
144+
*bufp = 0;
145+
return n-1;
146+
}
147+
148+
/**********************************
149+
* Wrappers for robust I/O routines
150+
**********************************/
151+
ssize_t Rio_readn(int fd, void *ptr, size_t nbytes)
152+
{
153+
ssize_t n;
154+
155+
if ((n = rio_readn(fd, ptr, nbytes)) < 0)
156+
unix_error("Rio_readn error");
157+
return n;
158+
}
159+
160+
void Rio_writen(int fd, void *usrbuf, size_t n)
161+
{
162+
if (rio_writen(fd, usrbuf, n) != n)
163+
unix_error("Rio_writen error");
164+
}
165+
166+
void Rio_readinitb(rio_t *rp, int fd)
167+
{
168+
rio_readinitb(rp, fd);
169+
}
170+
171+
ssize_t Rio_readnb(rio_t *rp, void *usrbuf, size_t n)
172+
{
173+
ssize_t rc;
174+
175+
if ((rc = rio_readnb(rp, usrbuf, n)) < 0)
176+
unix_error("Rio_readnb error");
177+
return rc;
178+
}
179+
180+
ssize_t Rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen)
181+
{
182+
ssize_t rc;
183+
184+
if ((rc = rio_readlineb(rp, usrbuf, maxlen)) < 0)
185+
unix_error("Rio_readlineb error");
186+
return rc;
187+
}

src/rio.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#ifndef _RIO_H_
2+
#define _RIO_H
3+
4+
#define RIO_BUFSIZE 8192
5+
6+
typedef struct {
7+
int rio_fd; /* Descriptor for this internal buf */
8+
int rio_cnt; /* Unread bytes in internal buf */
9+
char *rio_bufptr; /* Next unread byte in internal buf */
10+
char rio_buf[RIO_BUFSIZE]; /* Internal buffer */
11+
} rio_t;
12+
13+
14+
ssize_t rio_readn(int fd, void *usrbuf, size_t n);
15+
ssize_t rio_writen(int fd, void *usrbuf, size_t n);
16+
void rio_readinitb(rio_t *rp, int fd);
17+
ssize_t rio_readnb(rio_t *rp, void *usrbuf, size_t n);
18+
ssize_t rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen);
19+
20+
/* Wrappers for Rio package */
21+
ssize_t Rio_readn(int fd, void *usrbuf, size_t n);
22+
void Rio_writen(int fd, void *usrbuf, size_t n);
23+
void Rio_readinitb(rio_t *rp, int fd);
24+
ssize_t Rio_readnb(rio_t *rp, void *usrbuf, size_t n);
25+
ssize_t Rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen);
26+
27+
#endif

0 commit comments

Comments
 (0)