static DBusHandlerResult handle_get(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_server_lookup *sl) {
    DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED;
    const char* interface;
    const char* property;
    DBusMessage *reply = NULL;

    pa_assert(conn);
    pa_assert(msg);
    pa_assert(sl);

    if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID)) {
        if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, "Invalid arguments"))) {
            r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
            goto finish;
        }
        if (!dbus_connection_send(conn, reply, NULL)) {
            r = DBUS_HANDLER_RESULT_NEED_MEMORY;
            goto finish;
        }
        r = DBUS_HANDLER_RESULT_HANDLED;
        goto finish;
    }

    if (*interface && !pa_streq(interface, INTERFACE)) {
        r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
        goto finish;
    }

    if (!pa_streq(property, "Address")) {
        if (!(reply = dbus_message_new_error_printf(msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "%s: No such property", property))) {
            r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
            goto finish;
        }
        if (!dbus_connection_send(conn, reply, NULL)) {
            r = DBUS_HANDLER_RESULT_NEED_MEMORY;
            goto finish;
        }
        r = DBUS_HANDLER_RESULT_HANDLED;
        goto finish;
    }

    r = handle_get_address(conn, msg, sl);

finish:
    if (reply)
        dbus_message_unref(reply);

    return r;
}
Exemple #2
0
 std::string get_address(const UUID& uuid) const
 {
     if (down_context_.empty()) return handle_get_address(uuid);
     else return (*down_context_.begin())->get_address(uuid);
 }
int main(int argc, char **argv)
{
    if(argc < 2) { fprintf(stderr, "Usage: %s [port]\n", argv[0]); return 1; }

    int socket_server, socket_client;
    struct sockaddr_in address_server, address_client;
    handle_put_address(&address_server, "0.0.0.0", atoi(argv[1]));

    handle_socket_open_tcp(&socket_server);
    handle_socket_bind(socket_server, &address_server);
    handle_socket_listen(socket_server, 10);
    while(true)
    {
        handle_socket_accept(&socket_client, socket_server, &address_client);

        char request[HANDLE_HTTP_BUFFER_SIZE];
        read(socket_client, request, sizeof(request));
        if(! strncmp(request, "GET", 3))
        {
            handle_http_header_status(socket_client, 200);
            handle_http_header(socket_client);

            socklen_t address_len = sizeof(address_client);

            char remote_addr[HANDLE_HTTP_BUFFER_SIZE];
            getpeername(socket_client, (struct sockaddr *)&address_client, &address_len);
            handle_get_address(remote_addr, &address_client);

            char time_local[HANDLE_HTTP_BUFFER_SIZE];
            time_t ct = time(NULL);
            struct tm *lt = localtime(&ct);
            strftime(time_local, sizeof(time_local), "%d/%b/%Y:%H:%M:%S %z", lt);

            FILE *log_f = fopen(log_fname, "a");
            int status = 0, byte_sent = 0;
            char remote_user[] = "-", request_head[] = "-", http_referer[] = "-", http_user_agent[] = "-";
            fprintf(log_f,
                "%s - %s [%s] \"%s\" %d %d \"%s\" \"%s\"\n"
                , remote_addr
                , remote_user
                , time_local
                , request_head
                , status
                , byte_sent
                , http_referer
                , http_user_agent
            );
            fclose(log_f);

            char *output[3] = { remote_addr, http_user_agent, request };
            output_html(socket_client, output);
            handle_socket_close(socket_client);
        }
        else
        {
            handle_http_header_status(socket_client, 400);
            handle_socket_close(socket_client);
        }
    }

    return 0;
}