Exemple #1
0
static void
sp_socksrv_shutdown(Spsrv *srv)
{
    Socksrv *ss;

    ss = srv->srvaux;
    ss->shutdown = 1;
    spfd_remove(ss->spfd);
    close(ss->sock);
}
Exemple #2
0
static int
sp_ethconn_shutdown(Spconn *conn)
{
	Spethconn *ethconn = conn->caux;

	close(ethconn->fd);
	spfd_remove(ethconn->spfd);
	free(ethconn);

	return 1;
}
Exemple #3
0
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);
}
Exemple #4
0
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();
		}
	}
*/
}
Exemple #5
0
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;
	}
}
Exemple #6
0
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);
}