Npsrv* np_srv_create(int nwthread, int flags) { Npsrv *srv = NULL; np_uerror (0); if (!(srv = malloc(sizeof(*srv)))) { np_uerror (ENOMEM); goto error; } memset (srv, 0, sizeof (*srv)); pthread_mutex_init(&srv->lock, NULL); pthread_cond_init(&srv->conncountcond, NULL); srv->msize = 8216; srv->flags = flags; srv->netroot = np_net_make_root(); if (srv->netroot == 0) goto error; if (np_usercache_create (srv) < 0) goto error; srv->nwthread = nwthread; if (!(srv->tpool = np_tpool_create (srv, "default"))) goto error; np_tpool_incref (srv->tpool); np_assert_srv = srv; return srv; error: if (srv) np_srv_destroy (srv); return NULL; }
void np_tpool_select (Npreq *req) { Npsrv *srv = req->conn->srv; Nptpool *tp; if ((srv->flags & SRV_FLAGS_TPOOL_SINGLE)) return; if (!req->fid || !req->fid->aname || *req->fid->aname != '/') return; if (req->fid->tpool) return; xpthread_mutex_lock (&srv->lock); for (tp = srv->tpool; tp != NULL; tp = tp->next) { if (!strcmp (req->fid->aname, tp->name)) break; } if (!tp) { tp = np_tpool_create(srv, req->fid->aname); if (tp) { assert (srv->tpool); /* default tpool */ tp->next = srv->tpool->next; srv->tpool->next = tp; } else np_logerr (srv, "np_tpool_create %s", req->fid->aname); } if (tp) { np_tpool_incref (tp); req->fid->tpool = tp; } xpthread_mutex_unlock (&srv->lock); }
Npsrv* np_srv_create(int nwthread, int flags) { Npsrv *srv = NULL; np_uerror (0); if (!(srv = malloc(sizeof(*srv)))) { np_uerror (ENOMEM); goto error; } memset (srv, 0, sizeof (*srv)); pthread_mutex_init(&srv->lock, NULL); pthread_cond_init(&srv->conncountcond, NULL); srv->msize = 8216; srv->flags = flags; if (np_ctl_initialize (srv) < 0) goto error; if (!np_ctl_addfile (srv->ctlroot, "version", _ctl_get_version, NULL)) goto error; if (!np_ctl_addfile (srv->ctlroot, "connections", _ctl_get_connections, srv)) goto error; if (!np_ctl_addfile (srv->ctlroot, "tpools", _ctl_get_tpools, srv)) goto error; if (!np_ctl_addfile (srv->ctlroot, "requests", _ctl_get_requests, srv)) goto error; if (np_usercache_create (srv) < 0) goto error; srv->nwthread = nwthread; if (!(srv->tpool = np_tpool_create (srv, "default"))) goto error; np_tpool_incref (srv->tpool); return srv; error: if (srv) np_srv_destroy (srv); return NULL; }
Npfcall * np_walk(Npreq *req, Npfcall *tc) { int i; Npconn *conn = req->conn; Npfid *fid = req->fid; Npfid *newfid = NULL; Npfcall *rc = NULL; Npqid wqids[P9_MAXWELEM]; if (!fid) { np_uerror (EIO); goto done; } #if 0 if (!(fid->type & P9_QTDIR)) { np_uerror(ENOTDIR); goto done; } #endif /* FIXME: error if fid has been opened */ if (tc->u.twalk.nwname > P9_MAXWELEM) { np_uerror(EIO); goto done; } if (tc->u.twalk.fid != tc->u.twalk.newfid) { newfid = np_fid_find(conn, tc->u.twalk.newfid); if (newfid) { np_uerror(EIO); goto done; } newfid = np_fid_create(conn, tc->u.twalk.newfid, NULL); if (!newfid) goto done; if (fid->type & P9_QTTMP) { if (!np_ctl_clone (fid, newfid)) goto done; } else { if (!conn->srv->clone) goto done; if (!(*conn->srv->clone)(fid, newfid)) goto done; } np_user_incref(fid->user); newfid->user = fid->user; np_tpool_incref(fid->tpool); newfid->tpool = fid->tpool; newfid->type = fid->type; if (!(newfid->aname = strdup (fid->aname))) { np_uerror (ENOMEM); goto done; } } else newfid = fid; np_fid_incref(newfid); if (!(newfid->type & P9_QTTMP)) { if (np_setfsid (req, newfid->user, -1) < 0) goto done; } for(i = 0; i < tc->u.twalk.nwname;) { if (newfid->type & P9_QTTMP) { if (!np_ctl_walk (newfid, &tc->u.twalk.wnames[i], &wqids[i])) break; } else { if (!conn->srv->walk) { np_uerror (ENOSYS); break; } if (!(*conn->srv->walk)(newfid, &tc->u.twalk.wnames[i], &wqids[i])) break; } newfid->type = wqids[i].type; i++; if (i<(tc->u.twalk.nwname) && !(newfid->type & P9_QTDIR)) break; } if (i==0 && tc->u.twalk.nwname!=0) goto done; np_uerror(0); if (tc->u.twalk.fid != tc->u.twalk.newfid) np_fid_incref(newfid); rc = np_create_rwalk(i, wqids); done: np_fid_decref(newfid); return rc; }