105 sfd.header = NULL; |
105 sfd.header = NULL; |
106 sfd.trailer = NULL; |
106 sfd.trailer = NULL; |
107 net_sendfile(sn->csd, &sfd); |
107 net_sendfile(sn->csd, &sfd); |
108 |
108 |
109 vfs_close(fd); |
109 vfs_close(fd); |
110 |
|
111 |
|
112 /* send file*/ |
|
113 //SystemIOStream *io = (SystemIOStream*) sn->csd; |
|
114 //off_t fileoffset = 0; |
|
115 //int len = atoi(pblock_findkeyval(pb_key_content_length, rq->srvhdrs)); |
|
116 //sendfile(io->fd, fd->fd, &fileoffset, len); |
|
117 |
|
118 //close(fd); |
|
119 |
110 |
120 return REQ_PROCEED; |
111 return REQ_PROCEED; |
121 } |
112 } |
122 |
113 |
123 int service_hello(pblock *pb, Session *sn, Request *rq) { |
114 int service_hello(pblock *pb, Session *sn, Request *rq) { |
137 char *uri = pblock_findkeyval(pb_key_uri, rq->reqpb); |
128 char *uri = pblock_findkeyval(pb_key_uri, rq->reqpb); |
138 |
129 |
139 sstr_t r_uri = sstr(uri); |
130 sstr_t r_uri = sstr(uri); |
140 |
131 |
141 /* open the file */ |
132 /* open the file */ |
142 int fd = open(ppath, O_RDONLY); |
133 VFSContext *vfs = vfs_request_context(sn, rq); |
143 if(fd < 0) { |
134 VFS_DIR dir = vfs_opendir(vfs, ppath); |
144 //perror("service_index: open"); |
135 if(!dir) { |
145 |
|
146 int status = 500; |
|
147 switch(errno) { |
|
148 case EACCES: { |
|
149 status = 403; |
|
150 break; |
|
151 } |
|
152 case ENOENT: { |
|
153 status = 404; |
|
154 break; |
|
155 } |
|
156 } |
|
157 protocol_status(sn, rq, status, NULL); |
|
158 //printf("REQ_ABORTED\n"); |
|
159 return REQ_ABORTED; |
|
160 } |
|
161 |
|
162 DIR *dir = fdopendir(fd); |
|
163 if(dir == NULL) { |
|
164 protocol_status(sn, rq, 500, NULL); |
|
165 //printf("DIR is null\n"); |
|
166 return REQ_ABORTED; |
136 return REQ_ABORTED; |
167 } |
137 } |
168 |
138 |
169 sbuf_t *out = sbuf_new(1024); /* output buffer */ |
139 sbuf_t *out = sbuf_new(1024); /* output buffer */ |
170 |
140 |
173 sbuf_puts(out, uri); |
143 sbuf_puts(out, uri); |
174 sbuf_puts(out, "</title>\n</head><body>\n<h1>Index of "); |
144 sbuf_puts(out, "</title>\n</head><body>\n<h1>Index of "); |
175 sbuf_puts(out, uri); |
145 sbuf_puts(out, uri); |
176 sbuf_puts(out, "</h1><hr>\n\n"); |
146 sbuf_puts(out, "</h1><hr>\n\n"); |
177 |
147 |
178 struct dirent *f; |
148 //struct dirent *f; |
179 while((f = readdir(dir)) != NULL) { |
149 VFS_ENTRY f; |
180 if(strcmp(f->d_name, ".") == 0 || strcmp(f->d_name, "..") == 0) { |
150 while((vfs_readdir(dir, &f)) != NULL) { |
|
151 if(strcmp(f.name, ".") == 0 || strcmp(f.name, "..") == 0) { |
181 continue; |
152 continue; |
182 } |
153 } |
183 |
154 |
184 sstr_t filename = sstr(f->d_name); |
155 sstr_t filename = sstr(f.name); |
185 |
156 |
186 sbuf_puts(out, "<a href=\""); |
157 sbuf_puts(out, "<a href=\""); |
187 sbuf_append(out, r_uri); |
158 sbuf_append(out, r_uri); |
188 sbuf_append(out, filename); |
159 sbuf_append(out, filename); |
189 sbuf_puts(out, "\">"); |
160 sbuf_puts(out, "\">"); |