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; }