Npfcall* diod_mkdir (Npfid *fid, Npstr *name, u32 mode, u32 gid) { Fid *f = fid->aux; Npfcall *ret = NULL; char *npath = NULL; Npqid qid; struct stat sb; mode_t saved_umask; int created = 0; if ((f->xflags & XFLAGS_RO)) { np_uerror (EROFS); goto error_quiet; } if (!(npath = _mkpath(f->path, name))) { np_uerror (ENOMEM); goto error; } saved_umask = umask(0); if (mkdir (npath, mode) < 0) { np_uerror (errno); goto error_quiet; } created = 1; umask(saved_umask); if (lstat (npath, &sb) < 0) { np_uerror (errno); goto error; /* shouldn't happen? */ } _ustat2qid (&sb, &qid); if (!((ret = np_create_rmkdir (&qid)))) { np_uerror (ENOMEM); goto error; } free (npath); return ret; error: errn (np_rerror (), "diod_mkdir %s@%s:%s/%.*s", fid->user->uname, np_conn_get_client_id (fid->conn), f->path, name->len, name->str); error_quiet: if (created && npath) (void)rmdir(npath); if (npath) free (npath); if (ret) free (ret); return NULL; }
static void test_rmkdir (void) { Npfcall *fc, *fc2; struct p9_qid qid = { 1, 2, 3 }; if (!(fc = np_create_rmkdir (&qid))) msg_exit ("out of memory"); fc2 = _rcv_buf (fc, P9_RMKDIR, __FUNCTION__); assert (fc->u.rmkdir.qid.type == fc2->u.rmkdir.qid.type); assert (fc->u.rmkdir.qid.version == fc2->u.rmkdir.qid.version); assert (fc->u.rmkdir.qid.path == fc2->u.rmkdir.qid.path); free (fc); free (fc2); }
Npfcall* diod_mkdir (Npfid *fid, Npstr *name, u32 mode, u32 gid) { Npsrv *srv = fid->conn->srv; Fid *f = fid->aux; Npfcall *ret; Path npath = NULL; Npqid qid; struct stat sb; if ((f->flags & DIOD_FID_FLAGS_ROFS)) { np_uerror (EROFS); goto error_quiet; } if (!(npath = path_append (srv, f->path, name))) { np_uerror (ENOMEM); goto error; } if (mkdir (path_s (npath), mode) < 0 || lstat (path_s (npath), &sb) < 0) { np_uerror (errno); goto error_quiet; } diod_ustat2qid (&sb, &qid); if (!((ret = np_create_rmkdir (&qid)))) { (void)rmdir(path_s (npath)); np_uerror (ENOMEM); goto error; } path_decref (srv, npath); return ret; error: errn (np_rerror (), "diod_mkdir %s@%s:%s/%.*s", fid->user->uname, np_conn_get_client_id (fid->conn), path_s (f->path), name->len, name->str); error_quiet: if (npath) path_decref (srv, npath); return NULL; }
Npfcall* diod_mkdir (Npfid *fid, Npstr *name, u32 mode, u32 gid) { Fid *f = fid->aux; Npfcall *ret; char *npath = NULL; Npqid qid; struct stat sb; if ((f->xflags & XFLAGS_RO)) { np_uerror (EROFS); goto error_quiet; } if (!(npath = _mkpath(f->path, name))) { np_uerror (ENOMEM); goto error; } if (mkdir (npath, mode) < 0 || lstat (npath, &sb) < 0) { np_uerror (errno); goto error_quiet; } _ustat2qid (&sb, &qid); if (!((ret = np_create_rmkdir (&qid)))) { (void)rmdir(npath); np_uerror (ENOMEM); goto error; } free (npath); return ret; error: errn (np_rerror (), "diod_mkdir %s@%s:%s/%.*s", fid->user->uname, np_conn_get_client_id (fid->conn), f->path, name->len, name->str); error_quiet: if (npath) free (npath); return NULL; }