src/server/safs/service.c

changeset 55
b7908bf38f9f
parent 54
3a1d5a52adfc
child 56
c6cf20b09043
equal deleted inserted replaced
54:3a1d5a52adfc 55:b7908bf38f9f
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, "\">");
201 http_start_response(sn, rq); 172 http_start_response(sn, rq);
202 173
203 net_write(sn->csd, out->ptr, out->length); 174 net_write(sn->csd, out->ptr, out->length);
204 175
205 /* close */ 176 /* close */
206 closedir(dir); 177 vfs_closedir(dir);
207 sbuf_free(out); 178 sbuf_free(out);
208 179
209 return REQ_PROCEED; 180 return REQ_PROCEED;
210 } 181 }
211 182

mercurial