static void sp_socksrv_shutdown(Spsrv *srv) { Socksrv *ss; ss = srv->srvaux; ss->shutdown = 1; spfd_remove(ss->spfd); close(ss->sock); }
static int sp_ethconn_shutdown(Spconn *conn) { Spethconn *ethconn = conn->caux; close(ethconn->fd); spfd_remove(ethconn->spfd); free(ethconn); return 1; }
void pip_destroy(Xfilepipe *p) { // fprintf(stderr, "pip_destroy pip %p\n", p); if (p->lspfd) { spfd_remove(p->lspfd); p->lspfd = NULL; } if (p->lfd >= 0) close(p->lfd); if (p->rfd >= 0) close(p->rfd); p->err = EPIPE; free(p->buf); free(p); }
void spcfd_remove(Spcfd *spcfd) { Spcfd *ps, *s; if (!spcfd->spfd && (spcfd->wpos>0 || spcfd->rtc)) { spcfd->flags |= Remove; return; } if (spcfd->spfd) { spfd_remove(spcfd->spfd); spcfd->spfd = NULL; } for(ps = NULL, s = spcfds; s != NULL; ps = s, s = s->next) if (s == spcfd) { if (ps) ps->next = s->next; else spcfds = s->next; free(s); break; } /* if (spcfd_shutdown) { for(s = spcfds; s != NULL; s = s->next) if (s->wpos>0 || s->rtc) break; if (!s) { spcfd_shutdown = 0; sp_poll_stop(); } } */ }
static void pip_disconnect(Xfilepipe *p) { Spfcall *rc; Xpipereq *preq, *preq1; if (p->lspfd) spfd_remove(p->lspfd); p->lspfd = NULL; p->err = EPIPE; if (p->direction == Read) { // if (p->buflen > 0) pip_read_buf(p); // preq = p->reqs; // while (preq != NULL) { // preq1 = preq->next; // rc = sp_create_rread(0, NULL); // sp_respond(preq->req, rc); // free(preq); // preq = preq1; // } // p->reqs = NULL; } else if (p->direction == Write) { preq = p->reqs; while (preq != NULL) { preq1 = preq->next; rc = sp_create_rwrite(p->buflen); sp_respond(preq->req, rc); p->buflen = 0; free(preq); preq = preq1; } p->reqs = NULL; } }
void spc_disconnect_fsys(Spcfsys *fs) { int ecode; char *ename; Spcreq *req, *req1; sp_rerror(&fs->ename, &fs->ecode); if (fs->ecode) { fs->ename = strdup(fs->ename); if (!fs->ename) fs->ename = Enomem; } if (fs->root) { spc_fid_free(fs->root); fs->root = NULL; } if (fs->afid) { spc_fid_free(fs->afid); fs->afid = NULL; } if (fs->fd >= 0) { shutdown(fs->fd, 2); close(fs->fd); fs->fd = -1; } if (fs->spfd) { spfd_remove(fs->spfd); fs->spfd = NULL; } sp_rerror(&ename, &ecode); if (ecode) { ename = strdup(ename); if (!ename) { ename = Enomem; ecode = ENOMEM; } } sp_werror(Econn, ECONNRESET); req = fs->pend_first; while (req != NULL) { (*req->cb)(req->cba, NULL); req1 = req->next; free(req); req = req1; } fs->pend_first = NULL; req = fs->sent_reqs; while (req != NULL) { (*req->cb)(req->cba, NULL); req1 = req->next; free(req); req = req1; } fs->sent_reqs = NULL; sp_werror(ename, ecode); if (ename != Enomem) free(ename); }