removed libcext/array.c

This commit is contained in:
Anselm R. Garbe 2006-04-03 16:48:41 +02:00
parent 41f9a57ba6
commit 04323be88b
6 changed files with 46 additions and 84 deletions

View File

@ -575,8 +575,7 @@ xattach(IXPConn *c, Fcall *fcall)
IXPMap *new = cext_emallocz(sizeof(IXPMap));
new->qid = root_qid;
new->fid = fcall->fid;
c->map = (IXPMap **)cext_array_attach((void **)c->map, new,
sizeof(IXPMap *), &c->mapsz);
cext_vattach(ixp_map2vector(&c->map), new);
fcall->id = RATTACH;
fcall->qid = root_qid;
ixp_server_respond_fcall(c, fcall);
@ -608,8 +607,7 @@ xwalk(IXPConn *c, Fcall *fcall)
if(nwqid == fcall->nwname) {
if(fcall->fid != fcall->newfid) {
m = cext_emallocz(sizeof(IXPMap));
c->map = (IXPMap **)cext_array_attach((void **)c->map, m,
sizeof(IXPMap *), &c->mapsz);
cext_vattach(ixp_map2vector(&c->map), m);
}
m->qid = dir;
m->fid = fcall->newfid;
@ -680,7 +678,7 @@ xremove(IXPConn *c, Fcall *fcall)
if(type != FsDlabel)
return Enoperm;
/* clunk */
cext_array_detach((void **)c->map, m, &c->mapsz);
cext_vdetach(ixp_map2vector(&c->map), m);
free(m);
switch(type) {
case FsDlabel:
@ -1363,7 +1361,7 @@ xclunk(IXPConn *c, Fcall *fcall)
update_keys();
else if(type == FsFrules)
update_rules();
cext_array_detach((void **)c->map, m, &c->mapsz);
cext_vdetach(ixp_map2vector(&c->map), m);
free(m);
fcall->id = RCLUNK;
ixp_server_respond_fcall(c, fcall);
@ -1403,8 +1401,8 @@ write_event(char *event)
{
unsigned int i = 0;
for(i = 0; (i < srv.connsz) && srv.conn[i]; i++) {
IXPConn *c = srv.conn[i];
for(i = 0; i < srv.conn.size; i++) {
IXPConn *c = srv.conn.data[i];
if(c->is_pending) {
/* pending reads on /event only, no qid checking */
IXPMap *m = ixp_server_fid2map(c, c->pending.fid);

View File

@ -3,7 +3,7 @@
include ../config.mk
SRC = array.c emallocz.c estrdup.c strlcat.c strlcpy.c strtonum.c tokenize.c vector.c
SRC = emallocz.c estrdup.c strlcat.c strlcpy.c strtonum.c tokenize.c vector.c
OBJ = ${SRC:.c=.o}

View File

@ -1,44 +0,0 @@
/*
* (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include <stdlib.h>
#include "cext.h"
void **
cext_array_attach(void **array, void *p, unsigned int psize, unsigned int *size)
{
unsigned int i;
if(!array) {
*size = 2;
array = cext_emallocz(psize * (*size));
}
for(i = 0; (i < (*size)) && array[i]; i++);
if(i >= (*size)) {
void **tmp = array;
unsigned int newsz = (*size) * 2;
array = cext_emallocz(psize * newsz);
for(i = 0; i < (*size); i++)
array[i] = tmp[i];
free(tmp);
*size = newsz;
}
array[i] = p;
return array;
}
void
cext_array_detach(void **array, void *p, unsigned int *size)
{
unsigned int i;
if(!array)
return;
for(i = 0; (i < (*size)) && array[i] && array[i] != p; i++);
if((i >= (*size)) || !array[i])
return; /* not found */
for(; (i + 1 < (*size)) && array[i + 1]; i++)
array[i] = array[i + 1];
array[i] = nil;
}

View File

@ -9,10 +9,6 @@
#define nil (void *)0
#endif
/* array.c */
void ** cext_array_attach(void **array, void *p, unsigned int psize, unsigned int *size);
void cext_array_detach(void **array, void *p, unsigned int *size);
/* emallocz.c */
void *cext_emallocz(unsigned int size);

View File

@ -154,21 +154,22 @@ struct IXPMap {
Qid qid;
};
VECTOR(MapVector, IXPMap *);
struct IXPConn {
int fd;
IXPServer *srv;
void (*read) (IXPConn *);
void (*close) (IXPConn *);
IXPMap **map;
unsigned int mapsz;
MapVector map;
Fcall pending;
int is_pending;
};
VECTOR(ConnVector, IXPConn *);
struct IXPServer {
int running;
IXPConn **conn;
unsigned int connsz;
ConnVector conn;
int maxfd;
fd_set rd;
};
@ -239,6 +240,7 @@ unsigned int ixp_server_receive_fcall(IXPConn *c, Fcall *fcall);
int ixp_server_respond_fcall(IXPConn *c, Fcall *fcall);
int ixp_server_respond_error(IXPConn *c, Fcall *fcall, char *errstr);
void ixp_server_close(IXPServer *s);
Vector *ixp_map2vector(MapVector *mv);
/* socket.c */
int ixp_connect_sock(char *address);

View File

@ -18,6 +18,18 @@
static unsigned char *msg[IXP_MAX_MSG];
static Vector *
conn2vector(ConnVector *cv)
{
return (Vector *) cv;
}
Vector *
ixp_map2vector(MapVector *mv)
{
return (Vector *) mv;
}
IXPConn *ixp_server_open_conn(IXPServer *s, int fd, void (*read)(IXPConn *c),
void (*close)(IXPConn *c))
{
@ -26,21 +38,19 @@ IXPConn *ixp_server_open_conn(IXPServer *s, int fd, void (*read)(IXPConn *c),
c->srv = s;
c->read = read;
c->close = close;
s->conn = (IXPConn **)cext_array_attach((void **)s->conn, c,
sizeof(IXPConn *), &s->connsz);
cext_vattach(conn2vector(&s->conn), c);
return c;
}
void
ixp_server_close_conn(IXPConn *c)
{
unsigned int i;
IXPServer *s = c->srv;
cext_array_detach((void **)s->conn, c, &s->connsz);
if(c->map) {
for(i = 0; (i < c->mapsz) && c->map[i]; i++)
free(c->map[i]);
free(c->map);
cext_vdetach(conn2vector(&s->conn), c);
while(c->map.size) {
IXPMap *m = c->map.data[0];
cext_vdetach(ixp_map2vector(&c->map), m);
free(m);
}
shutdown(c->fd, SHUT_RDWR);
close(c->fd);
@ -52,11 +62,11 @@ prepare_select(IXPServer *s)
{
int i;
FD_ZERO(&s->rd);
for(i = 0; (i < s->connsz) && s->conn[i]; i++) {
if(s->maxfd < s->conn[i]->fd)
s->maxfd = s->conn[i]->fd;
if(s->conn[i]->read)
FD_SET(s->conn[i]->fd, &s->rd);
for(i = 0; i < s->conn.size; i++) {
if(s->maxfd < s->conn.data[i]->fd)
s->maxfd = s->conn.data[i]->fd;
if(s->conn.data[i]->read)
FD_SET(s->conn.data[i]->fd, &s->rd);
}
}
@ -64,10 +74,10 @@ static void
handle_conns(IXPServer *s)
{
int i;
for(i = 0; (i < s->connsz) && s->conn[i]; i++)
if(FD_ISSET(s->conn[i]->fd, &s->rd) && s->conn[i]->read)
for(i = 0; i < s->conn.size; i++)
if(FD_ISSET(s->conn.data[i]->fd, &s->rd) && s->conn.data[i]->read)
/* call read handler */
s->conn[i]->read(s->conn[i]);
s->conn.data[i]->read(s->conn.data[i]);
}
char *
@ -77,7 +87,7 @@ ixp_server_loop(IXPServer *s)
s->running = 1;
/* main loop */
while(s->running && s->conn) {
while(s->running) {
prepare_select(s);
r = select(s->maxfd + 1, &s->rd, 0, 0, 0);
@ -95,9 +105,9 @@ IXPMap *
ixp_server_fid2map(IXPConn *c, unsigned int fid)
{
unsigned int i;
for(i = 0; (i < c->mapsz) && c->map[i]; i++)
if(c->map[i]->fid == fid)
return c->map[i];
for(i = 0; i < c->map.size; i++)
if(c->map.data[i]->fid == fid)
return c->map.data[i];
return nil;
}
@ -146,7 +156,7 @@ void
ixp_server_close(IXPServer *s)
{
unsigned int i;
for(i = 0; (i < s->connsz) && s->conn[i]; i++)
if(s->conn[i]->close)
s->conn[i]->close(s->conn[i]);
for(i = 0; i < s->conn.size; i++)
if(s->conn.data[i]->close)
s->conn.data[i]->close(s->conn.data[i]);
}