Example #1
0
int main(int argc, char **argv) {
    uint64_t from=0, to=0;

    for ever {
        uint64_t number;
        char buf[65];
        char *converted;

        while(from < 2) {
            if(prompt_number("From: ", &from, 10)) {
                from = 0;
                fputs("You must give a number\n", stderr);
            } else if(from < 2) fputs("You must give a number greater than two\n", stderr);
        }
        while(to < 2) {
            if(prompt_number("To: ", &to, 10)) {
                to = 0;
                fputs("You must give a number\n", stderr);
            } else if(to < 2) fputs("You must give a number greater than two\n", stderr);
        }

        printf("Converting from base-%d to base-%d\n", from, to);

        if(prompt_number("Number: ", &number, from)) {
            fputs("You must enter a valid number in that base (case-sensitive... A is 10, a is 42)\n",stderr);
            fflush(stderr);
        } else {

            if((converted=serialize_number(number, (unsigned char) to, buf))) {
                puts(converted);
            } else {
                fputs("Could not convert the number\n", stderr);
            }
        }
    }

    return 0;
}
/* add a throttle counter for a user, here user might be an alias or a fqn */
static void ngx_mail_throttle_user_add
    (ngx_str_t *user, throttle_callback_t *callback)
{
    ngx_pool_t             *pool    = callback->pool;
    ngx_log_t              *log     = callback->log;
    ngx_mail_session_t     *s       = callback->session;
    ngx_mail_throttle_srv_conf_t *tscf;
    mc_work_t               w;
    size_t                  l;
    ngx_str_t               k;
    ngx_str_t              *pdu, *key;
    u_char                 *p;
    ngx_uint_t              ttl;
    size_t                  ttld;

    ngx_log_error (NGX_LOG_INFO, log, 0, "create a throttle counter for user %V", user);
    w.ctx = callback;
    w.request_code = mcreq_add;
    w.response_code = mcres_unknown;
    w.on_success = ngx_mail_throttle_user_add_success_handler;
    w.on_failure = ngx_mail_throttle_user_add_failure_handler;

    k = ngx_memcache_get_user_throttle_key(pool, log, *user);
    if (k.len == 0) {
        ngx_log_error (NGX_LOG_ERR, log, 0,
            "allowing user %V login because of internal error "
            "in user throttle control (generate key for add)", user);
        callback->on_allow(callback);
        return;
    }

    key = ngx_pstrcpy (pool, &k);
    if (key == NULL) {
        ngx_log_error (NGX_LOG_ERR, log, 0,
            "allowing user %V login because of internal error "
            "in user throttle control (deep copy key for add)", user);
        callback->on_allow(callback);
        return;
    }

    tscf = ngx_mail_get_module_srv_conf (s, ngx_mail_throttle_module);
    ttl = tscf->mail_login_user_ttl / 1000;              /* msec => sec */
    if(tscf->mail_login_user_ttl % 1000 > 0) { ++ttl; }  /* round upward */
    ttld = serialize_number(NULL, ttl);

    l = sizeof("add ") - 1 +
        k.len +
        sizeof(" ") - 1 +
        sizeof("0 ") - 1 +
        ttld + sizeof(" ") - 1 +
        sizeof("1") - 1 + sizeof(CRLF) - 1 +
        1 + sizeof(CRLF) - 1;

    pdu = ngx_palloc (pool, sizeof(ngx_str_t));
    if (pdu == NULL) {
       ngx_log_error (NGX_LOG_ERR, log, 0,
               "allowing user %V login because of internal error"
               "in user throttle control (alloc mem for add pdu)", user);
       callback->on_allow(callback);
       return;
   }

    pdu->data = ngx_palloc(pool, l);
    if (pdu->data == NULL) {
        ngx_log_error (NGX_LOG_ERR, log, 0,
                "allowing user %V login because of internal error "
                "in user throttle control (alloc mem for add pdu data)", user);
        callback->on_allow(callback);
        return;
    }

    p = pdu->data;
    p = ngx_cpymem(p, "add ", sizeof("add ") - 1);
    p = ngx_cpymem(p, k.data, k.len);
    *p++ = ' ';
    *p++ = '0';
    *p++ = ' ';
    p+= serialize_number(p, ttl);
    *p++ = ' ';
    *p++ = '1';
    *p++ = CR;
    *p++ = LF;
    *p++ = '1';
    *p++ = CR;
    *p++ = LF;
    pdu->len = p - pdu->data;

    callback->key = key;
    callback->pdu = pdu;
    callback->user = user;

    ngx_memcache_post(&w, *key, *pdu,/* pool */ NULL, log);
    return;
}