/* Update interrupts. */ static void bcm2836_control_update(BCM2836ControlState *s) { int i, j; /* reset pending IRQs/FIQs */ for (i = 0; i < BCM2836_NCORES; i++) { s->irqsrc[i] = s->fiqsrc[i] = 0; } /* apply routing logic, update status regs */ if (s->gpu_irq) { assert(s->route_gpu_irq < BCM2836_NCORES); s->irqsrc[s->route_gpu_irq] |= (uint32_t)1 << IRQ_GPU; } if (s->gpu_fiq) { assert(s->route_gpu_fiq < BCM2836_NCORES); s->fiqsrc[s->route_gpu_fiq] |= (uint32_t)1 << IRQ_GPU; } for (i = 0; i < BCM2836_NCORES; i++) { /* handle local timer interrupts for this core */ if (s->timerirqs[i]) { assert(s->timerirqs[i] < (1 << (IRQ_CNTVIRQ + 1))); /* sane mask? */ for (j = 0; j <= IRQ_CNTVIRQ; j++) { if ((s->timerirqs[i] & (1 << j)) != 0) { /* local interrupt j is set */ deliver_local(s, i, j, s->timercontrol[i], j); } } } /* handle mailboxes for this core */ for (j = 0; j < BCM2836_MBPERCORE; j++) { if (s->mailboxes[i * BCM2836_MBPERCORE + j] != 0) { /* mailbox j is set */ deliver_local(s, i, j + IRQ_MAILBOX0, s->mailboxcontrol[i], j); } } } /* call set_irq appropriately for each output */ for (i = 0; i < BCM2836_NCORES; i++) { qemu_set_irq(s->irq[i], s->irqsrc[i] != 0); qemu_set_irq(s->fiq[i], s->fiqsrc[i] != 0); } }
int deliver_mail(char* ip,char* from,char* rcpt,char* data,int datalen) { char* domain = strchr(rcpt,'@')+1; printf("IP-Address: %s\nFrom: %s\nRecipient: %s\nDomain: %s\nData:\n%s\n",ip,from,rcpt,domain,data); if(strcmp(domain,LOCAL_DOMAIN) == 0) { //local delivery return deliver_local(ip,from,rcpt,data,datalen); } else { //relay return deliver_relay(ip,domain,from,rcpt,data,datalen); } }