static Npuser * _usercache_del (Npsrv *srv, Npuser *prev, Npuser *u) { Npusercache *uc = srv->usercache; Npuser *tmp = u->next; if (prev) prev->next = tmp; else uc->users = tmp; np_user_decref (u); return tmp; }
int diod_remapuser (Npfid *fid, Npstr *uname, u32 n_uname, Npstr *aname) { int ret = 0; if (diod_conf_get_allsquash ()) { char *squash = diod_conf_get_squashuser (); Npuser *user = NULL; if (!(user = np_uname2user (fid->conn->srv, squash))) { ret = -1; goto done; } if (fid->user) np_user_decref (fid->user); fid->user = user; } done: return ret; }
void np_fid_destroy(Npfid *fid) { int hash; Npconn *conn; Npsrv *srv; Npfidpool *fp; Npfid **htable; conn = fid->conn; srv = conn->srv; fp = conn->fidpool; if (!fp) return; // printf("destroy conn %p fid %d\n", conn, fid->fid); pthread_mutex_lock(&fp->lock); hash = fid->fid % fp->size; htable = fp->htable; if (fid->prev) fid->prev->next = fid->next; else htable[hash] = fid->next; if (fid->next) fid->next->prev = fid->prev; pthread_mutex_unlock(&fp->lock); if (fid->type & Qtauth && srv->auth && srv->auth->clunk) (*srv->auth->clunk)(fid); else if (!(fid->type&Qtauth) && srv->fiddestroy) (*srv->fiddestroy)(fid); if (fid->user) np_user_decref(fid->user); free(fid); return; }
static int _ioctx_close_destroy (IOCtx ioctx, int seterrno) { int rc = 0; if (ioctx->dir) { rc = closedir(ioctx->dir); if (rc < 0 && seterrno) np_uerror (errno); } else if (ioctx->fd != -1) { rc = close (ioctx->fd); if (rc < 0 && seterrno) np_uerror (errno); } if (ioctx->user) np_user_decref (ioctx->user); pthread_mutex_destroy (&ioctx->lock); free (ioctx); return rc; }
static Npfid * _destroy_fid (Npfid *f) { Npsrv *srv; Npfid *next; NP_ASSERT(f != NULL); NP_ASSERT(f->magic == FID_MAGIC); srv = f->conn->srv; next = f->next; if (f->refcount > 0 && (srv->flags & SRV_FLAGS_DEBUG_FIDPOOL)) { np_logmsg (srv, "_destroy_fid: fid %d has %d refs", f->fid, f->refcount); } if ((f->type & P9_QTAUTH)) { if (srv->auth && srv->auth->clunk) (*srv->auth->clunk)(f); } else if ((f->type & P9_QTTMP)) { np_ctl_fiddestroy (f); } else { if (srv->fiddestroy) (*srv->fiddestroy)(f); } if (f->user) np_user_decref(f->user); if (f->tpool) np_tpool_decref(f->tpool); if (f->aname) free (f->aname); pthread_mutex_destroy (&f->lock); f->magic = FID_MAGIC_FREED; free(f); return next; }