Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/websrv/websrv.c

    rd076f16 r8d2dd7f2  
    7575static uint16_t port = DEFAULT_PORT;
    7676
    77 typedef struct {
    78         tcp_conn_t *conn;
    79 
    80         char rbuf[BUFFER_SIZE];
    81         size_t rbuf_out;
    82         size_t rbuf_in;
    83 
    84         char lbuf[BUFFER_SIZE + 1];
    85         size_t lbuf_used;
    86 } recv_t;
     77static char rbuf[BUFFER_SIZE];
     78static size_t rbuf_out;
     79static size_t rbuf_in;
     80
     81static char lbuf[BUFFER_SIZE + 1];
     82static size_t lbuf_used;
     83
     84static char fbuf[BUFFER_SIZE];
    8785
    8886static bool verbose = false;
     
    133131    "</html>\r\n";
    134132
    135 
    136 static int recv_create(tcp_conn_t *conn, recv_t **rrecv)
    137 {
    138         recv_t *recv;
    139        
    140         recv = calloc(1, sizeof(recv_t));
    141         if (recv == NULL)
    142                 return ENOMEM;
    143        
    144         recv->conn = conn;
    145         recv->rbuf_out = 0;
    146         recv->rbuf_in = 0;
    147         recv->lbuf_used = 0;
    148        
    149         *rrecv = recv;
    150         return EOK;
    151 }
    152 
    153 static void recv_destroy(recv_t *recv)
    154 {
    155         free(recv);
    156 }
    157 
    158133/** Receive one character (with buffering) */
    159 static int recv_char(recv_t *recv, char *c)
     134static int recv_char(tcp_conn_t *conn, char *c)
    160135{
    161136        size_t nrecv;
    162137        int rc;
    163138       
    164         if (recv->rbuf_out == recv->rbuf_in) {
    165                 recv->rbuf_out = 0;
    166                 recv->rbuf_in = 0;
    167                
    168                 rc = tcp_conn_recv_wait(recv->conn, recv->rbuf, BUFFER_SIZE, &nrecv);
     139        if (rbuf_out == rbuf_in) {
     140                rbuf_out = 0;
     141                rbuf_in = 0;
     142               
     143                rc = tcp_conn_recv_wait(conn, rbuf, BUFFER_SIZE, &nrecv);
    169144                if (rc != EOK) {
    170145                        fprintf(stderr, "tcp_conn_recv() failed (%d)\n", rc);
     
    172147                }
    173148               
    174                 recv->rbuf_in = nrecv;
    175         }
    176        
    177         *c = recv->rbuf[recv->rbuf_out++];
     149                rbuf_in = nrecv;
     150        }
     151       
     152        *c = rbuf[rbuf_out++];
    178153        return EOK;
    179154}
    180155
    181156/** Receive one line with length limit */
    182 static int recv_line(recv_t *recv, char **rbuf)
    183 {
    184         char *bp = recv->lbuf;
     157static int recv_line(tcp_conn_t *conn)
     158{
     159        char *bp = lbuf;
    185160        char c = '\0';
    186161       
    187         while (bp < recv->lbuf + BUFFER_SIZE) {
     162        while (bp < lbuf + BUFFER_SIZE) {
    188163                char prev = c;
    189                 int rc = recv_char(recv, &c);
     164                int rc = recv_char(conn, &c);
    190165               
    191166                if (rc != EOK)
     
    197172        }
    198173       
    199         recv->lbuf_used = bp - recv->lbuf;
     174        lbuf_used = bp - lbuf;
    200175        *bp = '\0';
    201176       
    202         if (bp == recv->lbuf + BUFFER_SIZE)
     177        if (bp == lbuf + BUFFER_SIZE)
    203178                return ELIMIT;
    204179       
    205         *rbuf = recv->lbuf;
    206180        return EOK;
    207181}
     
    244218static int uri_get(const char *uri, tcp_conn_t *conn)
    245219{
    246         char *fbuf = NULL;
    247         char *fname = NULL;
    248         int rc;
    249         int fd = -1;
    250        
    251         fbuf = calloc(BUFFER_SIZE, 1);
    252         if (fbuf == NULL) {
    253                 rc = ENOMEM;
    254                 goto out;
    255         }
    256        
    257220        if (str_cmp(uri, "/") == 0)
    258221                uri = "/index.html";
    259222       
    260         rc = asprintf(&fname, "%s%s", WEB_ROOT, uri);
    261         if (rc < 0) {
    262                 rc = ENOMEM;
    263                 goto out;
    264         }
    265        
    266         fd = vfs_lookup_open(fname, WALK_REGULAR, MODE_READ);
     223        char *fname;
     224        int rc = asprintf(&fname, "%s%s", WEB_ROOT, uri);
     225        if (rc < 0)
     226                return ENOMEM;
     227       
     228        int fd = vfs_lookup_open(fname, WALK_REGULAR, MODE_READ);
    267229        if (fd < 0) {
    268230                rc = send_response(conn, msg_not_found);
    269                 goto out;
     231                free(fname);
     232                return rc;
    270233        }
    271234       
    272235        free(fname);
    273         fname = NULL;
    274236       
    275237        rc = send_response(conn, msg_ok);
    276238        if (rc != EOK)
    277                 goto out;
     239                return rc;
    278240       
    279241        aoff64_t pos = 0;
     
    284246               
    285247                if (nr < 0) {
    286                         rc = EIO;
    287                         goto out;
     248                        vfs_put(fd);
     249                        return EIO;
    288250                }
    289251               
     
    291253                if (rc != EOK) {
    292254                        fprintf(stderr, "tcp_conn_send() failed\n");
    293                         goto out;
     255                        vfs_put(fd);
     256                        return rc;
    294257                }
    295258        }
    296259       
    297         rc = EOK;
    298 out:
    299         if (fd >= 0)
    300                 vfs_put(fd);
    301         free(fname);
    302         free(fbuf);
    303         return rc;
    304 }
    305 
    306 static int req_process(tcp_conn_t *conn, recv_t *recv)
    307 {
    308         char *reqline = NULL;
    309 
    310         int rc = recv_line(recv, &reqline);
     260        vfs_put(fd);
     261       
     262        return EOK;
     263}
     264
     265static int req_process(tcp_conn_t *conn)
     266{
     267        int rc = recv_line(conn);
    311268        if (rc != EOK) {
    312269                fprintf(stderr, "recv_line() failed\n");
     
    315272       
    316273        if (verbose)
    317                 fprintf(stderr, "Request: %s", reqline);
    318        
    319         if (str_lcmp(reqline, "GET ", 4) != 0) {
     274                fprintf(stderr, "Request: %s", lbuf);
     275       
     276        if (str_lcmp(lbuf, "GET ", 4) != 0) {
    320277                rc = send_response(conn, msg_not_implemented);
    321278                return rc;
    322279        }
    323280       
    324         char *uri = reqline + 4;
     281        char *uri = lbuf + 4;
    325282        char *end_uri = str_chr(uri, ' ');
    326283        if (end_uri == NULL) {
    327                 end_uri = reqline + str_size(reqline) - 2;
     284                end_uri = lbuf + lbuf_used - 2;
    328285                assert(*end_uri == '\r');
    329286        }
     
    343300static void usage(void)
    344301{
    345         printf("Simple web server\n"
     302        printf("Skeletal server\n"
    346303            "\n"
    347304            "Usage: " NAME " [options]\n"
     
    406363{
    407364        int rc;
    408         recv_t *recv = NULL;
    409365       
    410366        if (verbose)
    411367                fprintf(stderr, "New connection, waiting for request\n");
    412368       
    413         rc = recv_create(conn, &recv);
    414         if (rc != EOK) {
    415                 fprintf(stderr, "Out of memory.\n");
    416                 goto error;
    417         }
    418        
    419         rc = req_process(conn, recv);
     369        rbuf_out = 0;
     370        rbuf_in = 0;
     371       
     372        rc = req_process(conn);
    420373        if (rc != EOK) {
    421374                fprintf(stderr, "Error processing request (%s)\n",
    422375                    str_error(rc));
    423                 goto error;
    424         }
    425        
     376                return;
     377        }
     378
    426379        rc = tcp_conn_send_fin(conn);
    427380        if (rc != EOK) {
    428381                fprintf(stderr, "Error sending FIN.\n");
    429                 goto error;
    430         }
    431 
    432         recv_destroy(recv);
    433         return;
    434 error:
    435         rc = tcp_conn_reset(conn);
    436         if (rc != EOK)
    437                 fprintf(stderr, "Error resetting connection.\n");
    438        
    439         recv_destroy(recv);
     382                return;
     383        }
    440384}
    441385
Note: See TracChangeset for help on using the changeset viewer.