Esempio n. 1
0
int server_stop(svx_looper_t *looper, void *arg)
{
    SVX_UTIL_UNUSED(looper);    
    SVX_UTIL_UNUSED(arg);
    
    /* Stop the HTTP server. */
    if(svx_tcp_server_destroy(&server)) exit(1);
    
    return 0;
}
Esempio n. 2
0
static int server_start(svx_looper_t *looper, void *arg)
{
    SVX_UTIL_UNUSED(arg);

    /* Init an address for HTTP server. */
    svx_inetaddr_t listen_addr;
    if(svx_inetaddr_from_ipport(&listen_addr, "0.0.0.0", 8080)) exit(1);

    /* Create the HTTP server. */
    if(svx_tcp_server_create(&server, looper, listen_addr)) exit(1);

    /* Set the server's I/O mode.
     *
     * 0 : No worker-thread will created. (all I/O in one thread)
     * N : Create N worker-thread for I/O.
     * */
    if(svx_tcp_server_set_io_loopers_num(server, 0)) exit(1);

    /* Set TCP keep-alive for discarding timeout connections. */
    if(svx_tcp_server_set_keepalive(server, 5, 1, 3)) exit(1);

    /* Set a callback fucntion for handling TCP connection established */
    if(svx_tcp_server_set_established_cb(server, server_established_cb, NULL)) exit(1);

    /* Set a callback function for handling HTTP request. */
    if(svx_tcp_server_set_read_cb(server, server_read_cb, NULL)) exit(1);

    /* Start the HTTP server. */
    if(svx_tcp_server_start(server)) exit(1);
    
    return 0;
}
Esempio n. 3
0
/* The callback to handle TCP connection established */
static void server_established_cb(svx_tcp_connection_t *conn, void *arg)
{
    SVX_UTIL_UNUSED(arg);

    /* In this simple program, although we always send all the response data in a single writing,
       but we still set the TCP_NODELAY. To be more close to the real world HTTP server. */
    if(svx_tcp_connection_set_nodelay(conn, 1)) exit(1);
}
Esempio n. 4
0
void cb(int fd, void *arg)
{
    SVX_UTIL_UNUSED(arg);
    
    /* append any messages to the dump file */
    if(fd >= 0)
    {
        if(write(fd, TEST_CRASH_EXTRA_MSG, test_crash_extra_msg_len) < 0)
            return;
    }

    /* do any thing your want, 
       your can only invoke async-signal-safe functions here, see man(7) signal */
    /* write(STDOUT_FILENO, "crash dump file ...... created\n", 31); */
}
Esempio n. 5
0
/* The callback to handle HTTP request */
static void server_read_cb(svx_tcp_connection_t *conn, svx_circlebuf_t *buf, void *arg)
{
    SVX_UTIL_UNUSED(arg);
    
    /* Get the current HTTP request. */
    char   req[1024];
    size_t req_len;
    if(svx_circlebuf_get_data_by_ending(buf, (const uint8_t *)"\r\n\r\n", 4,
                                        (uint8_t *)req, sizeof(req), &req_len)) return;

    /* We only deal with the /hello for test. */
    if(0 != memcmp(req, "GET /hello HTTP/1.", 18))
        svx_tcp_connection_shutdown_wr(conn);

    /* If we should keep the TCP connection? */
    int keep_alive = 1;
    if(strcasestr(req, "Connection: close\r\n") ||
       (!strcasestr(req, "Connection: keep-alive") && ('0' == req[18])/* HTTP 1.0 */))
        keep_alive = 0;

    /* Build the HTTP response. */
    char   resp[1024];
    size_t resp_len = snprintf(resp, sizeof(resp),
                               "HTTP/1.1 200 OK\r\n"
                               "Server: libsvx-simplest-HTTP-server\r\n"
                               "Content-Type: text/plain\r\n"
                               "Content-Length: 12\r\n"
                               "Connection: %s\r\n"
                               "\r\n"
                               "Hello world!",
                               keep_alive ? "keep-alive" : "close");

    /* Wirte the HTTP response to client. */
    svx_tcp_connection_write(conn, (const uint8_t *)resp, resp_len);

    /* Close the TCP connection. */
    if(!keep_alive) svx_tcp_connection_shutdown_wr(conn);
}
Esempio n. 6
0
static void svx_crash_write_baseinfo(int fd, ucontext_t *uc, int sig, siginfo_t *info,
                                     struct tm *tm, struct timespec *tp)
{
    char            buf[10240] = "\0";
    svx_crash_buf_t b          = SVX_CRASH_BUF_INITIALIZER;

    SVX_UTIL_UNUSED(uc);
    
    svx_crash_buf_init(&b, buf, sizeof(buf));

    /* write system version */
    svx_crash_write_sysinfo(fd, "/proc/version");

    /* append time */
    svx_crash_buf_append_str (&b, "Time: ");
    svx_crash_buf_append_uint(&b, tm->tm_year + 1900, 10, 4);
    svx_crash_buf_append_str (&b, "-");
    svx_crash_buf_append_uint(&b, tm->tm_mon + 1, 10, 2);
    svx_crash_buf_append_str (&b, "-");
    svx_crash_buf_append_uint(&b, tm->tm_mday, 10, 2);
    svx_crash_buf_append_str (&b, " ");
    svx_crash_buf_append_uint(&b, tm->tm_hour, 10, 2);
    svx_crash_buf_append_str (&b, ":");
    svx_crash_buf_append_uint(&b, tm->tm_min, 10, 2);
    svx_crash_buf_append_str (&b, ":");
    svx_crash_buf_append_uint(&b, tm->tm_sec, 10, 2);
    svx_crash_buf_append_str (&b, ".");
    svx_crash_buf_append_uint(&b, tp->tv_nsec / 1000, 10, 6);
    svx_crash_buf_append_str (&b, " ");
    svx_crash_buf_append_str (&b, svx_crash_timezone);

    /* append hostname */
    svx_crash_buf_append_str (&b, ", Hostname: ");
    svx_crash_buf_append_str (&b, svx_crash_hostname);

    /* append PID */
    svx_crash_buf_append_str (&b, ", PID: ");
    svx_crash_buf_append_uint(&b, getpid(), 10, 0);
    svx_crash_buf_append_str (&b, "\n");

    /* append signal & code */
#define SVX_CRASH_CASE_SIGNAL(signal)                                   \
    case signal:                                                        \
        svx_crash_buf_append_str(&b, " ("#signal"), Code: ");           \
        svx_crash_buf_append_int(&b, (uintmax_t)(info->si_code), 10, 0)
#define SVX_CRASH_CASE_CODE(code)                                       \
    case code:                                                          \
        svx_crash_buf_append_str(&b, " ("#code")");                     \
        break
#define SVX_CRASH_CASE_CODE_DEFAULT                                     \
    SVX_CRASH_CASE_CODE(SI_USER);                                       \
    SVX_CRASH_CASE_CODE(SI_KERNEL);                                     \
    SVX_CRASH_CASE_CODE(SI_QUEUE);                                      \
    SVX_CRASH_CASE_CODE(SI_TIMER);                                      \
    SVX_CRASH_CASE_CODE(SI_MESGQ);                                      \
    SVX_CRASH_CASE_CODE(SI_ASYNCIO);                                    \
    SVX_CRASH_CASE_CODE(SI_SIGIO);                                      \
    SVX_CRASH_CASE_CODE(SI_TKILL);                                      \
    default:                                                            \
        svx_crash_buf_append_str(&b, " (UNKNOWN_CODE)");                \
        break

    svx_crash_buf_append_str(&b, "Signal: ");
    svx_crash_buf_append_int(&b, (intmax_t)sig, 10, 0);
    switch(sig)
    {
        /* SIGSEGV */
        SVX_CRASH_CASE_SIGNAL(SIGSEGV);
        switch(info->si_code)
        {
            SVX_CRASH_CASE_CODE(SEGV_MAPERR);
            SVX_CRASH_CASE_CODE(SEGV_ACCERR);
            SVX_CRASH_CASE_CODE_DEFAULT;
        }
        break;

        /* SIGFPE */
        SVX_CRASH_CASE_SIGNAL(SIGFPE);
        switch(info->si_code)
        {
            SVX_CRASH_CASE_CODE(FPE_INTDIV);
            SVX_CRASH_CASE_CODE(FPE_INTOVF);
            SVX_CRASH_CASE_CODE(FPE_FLTDIV);
            SVX_CRASH_CASE_CODE(FPE_FLTOVF);
            SVX_CRASH_CASE_CODE(FPE_FLTUND);
            SVX_CRASH_CASE_CODE(FPE_FLTRES);
            SVX_CRASH_CASE_CODE(FPE_FLTINV);
            SVX_CRASH_CASE_CODE(FPE_FLTSUB);
            SVX_CRASH_CASE_CODE_DEFAULT;
        }
        break;

        /* SIGILL */
        SVX_CRASH_CASE_SIGNAL(SIGILL);
        switch(info->si_code)
        {
            SVX_CRASH_CASE_CODE(ILL_ILLOPC);
            SVX_CRASH_CASE_CODE(ILL_ILLOPN);
            SVX_CRASH_CASE_CODE(ILL_ILLADR);
            SVX_CRASH_CASE_CODE(ILL_ILLTRP);
            SVX_CRASH_CASE_CODE(ILL_PRVOPC);
            SVX_CRASH_CASE_CODE(ILL_PRVREG);
            SVX_CRASH_CASE_CODE(ILL_COPROC);
            SVX_CRASH_CASE_CODE(ILL_BADSTK);
            SVX_CRASH_CASE_CODE_DEFAULT;
        }
        break;

        /* SIGBUS */
        SVX_CRASH_CASE_SIGNAL(SIGBUS);
        switch(info->si_code)
        {
            SVX_CRASH_CASE_CODE(BUS_ADRALN);
            SVX_CRASH_CASE_CODE(BUS_ADRERR);
            SVX_CRASH_CASE_CODE(BUS_OBJERR);
#ifdef BUS_MCEERR_AR
            SVX_CRASH_CASE_CODE(BUS_MCEERR_AR);
#endif
#ifdef BUS_MCEERR_AO
            SVX_CRASH_CASE_CODE(BUS_MCEERR_AO);
#endif
            SVX_CRASH_CASE_CODE_DEFAULT;
        }
        break;

        /* SIGABRT */
        SVX_CRASH_CASE_SIGNAL(SIGABRT);
        switch(info->si_code)
        {
            SVX_CRASH_CASE_CODE_DEFAULT;
        }
        break;

#ifdef SIGSTKFLT
        /* SIGSTKFLT */
        SVX_CRASH_CASE_SIGNAL(SIGSTKFLT);
        switch(info->si_code)
        {
            SVX_CRASH_CASE_CODE_DEFAULT;
        }
        break;
#endif

    default:
        svx_crash_buf_append_str(&b, " (UNKNOWN_SIGNAL)");
        break;
    }

#undef SVX_CRASH_CASE_SIGNAL
#undef SVX_CRASH_CASE_CODE
#undef SVX_CRASH_CASE_CODE_DEFAULT

    /* append fault addr */
    svx_crash_buf_append_str(&b, ", Fault addr: ");
    svx_crash_buf_append_ptr(&b, (uintptr_t)(info->si_addr));
    svx_crash_buf_append_str(&b, "\n");

    svx_crash_write_buf(fd, svx_crash_buf_get_buf(&b), svx_crash_buf_get_buflen(&b));
}