Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "proto.h"
- int pending_max(int type) {
- switch(type) {
- case PENDING_SMTP:
- return PENDING_SMTP_MAX;
- break;
- case PENDING_SMTPA:
- return PENDING_SMTPA_MAX;
- break;
- #ifdef ENABLE_SSL
- case PENDING_SMTPS:
- return PENDING_SMTPS_MAX;
- break;
- #endif
- default:
- return 0;
- }
- }
- int pending_init_ring(int type) {
- int max;
- if (type < 0 || type >= PENDING_TYPES) return -1;
- max = pending_max(type);
- if (!max) return -1;
- g_pending[type] = malloc(sizeof(int) * max);
- if (!g_pending[type]) return -1;
- g_pending_head[type] = -1;
- g_pending_tail[type] = -1;
- return 0;
- }
- int pending_init() {
- if (pending_init_ring(PENDING_SMTP) < 0)
- return -1;
- if (pending_init_ring(PENDING_SMTPA) < 0)
- return -1;
- #ifdef ENABLE_SSL
- if (pending_init_ring(PENDING_SMTPS) < 0)
- return -1;
- #endif
- return 0;
- }
- int pending_push(int type, int fd) {
- if (type < 0 || type >= PENDING_TYPES) return -1;
- if (fd < 0) return -1;
- if (g_pending_head[type] == -1 &&
- g_pending_tail[type] == -1) {
- // ring buffer is empty
- g_pending[type][0] = fd;
- g_pending_head[type] = 0;
- g_pending_tail[type] = 1;
- return 0;
- }
- if (g_pending_head[type] == g_pending_tail[type]) {
- // ring buffer is full
- return -1;
- }
- g_pending[type][g_pending_tail[type]] = fd;
- g_pending_tail[type] = ((g_pending_tail[type] + 1) % pending_max(type));
- return 0;
- }
- int pending_pop(int type) {
- int fd;
- if (type < 0 || type >= PENDING_TYPES) return -1;
- if (g_pending_head[type] == -1 &&
- g_pending_tail[type] == -1) {
- // ring buffer is already empty
- return -1;
- }
- fd = g_pending[type][g_pending_head[type]];
- g_pending_head[type] = ((g_pending_head[type] + 1) % pending_max(type));
- if (g_pending_head[type] == g_pending_tail[type]) {
- // ring buffer now empty
- g_pending_head[type] = -1;
- g_pending_tail[type] = -1;
- }
- return fd;
- }
- int pending_empty(int type) {
- if (type < 0 || type >= PENDING_TYPES) return -1;
- if (g_pending_head[type] == -1 &&
- g_pending_tail[type] == -1) {
- // ring buffer is empty
- return 1;
- }
- return 0;
- }
- int pending_full(int type) {
- if (type < 0 || type >= PENDING_TYPES) return -1;
- if (g_pending_head[type] == -1 &&
- g_pending_tail[type] == -1) {
- // ring buffer is empty
- return 0;
- }
- if (g_pending_head[type] == g_pending_tail[type]) {
- // ring buffer full
- return 1;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement