static void test_rrename(void) { Npfcall *fc, *fc2; if (!(fc = np_create_rrename ())) msg_exit ("out of memory"); fc2 = _rcv_buf (fc, P9_RRENAME, __FUNCTION__); free (fc); free (fc2); }
/* Trename - rename a file, potentially to another directory */ Npfcall* diod_rename (Npfid *fid, Npfid *dfid, Npstr *name) { Fid *f = fid->aux; Fid *d = dfid->aux; Npfcall *ret = NULL; char *npath = NULL; int renamed = 0; if ((f->xflags & XFLAGS_RO)) { np_uerror (EROFS); goto error_quiet; } if (!(npath = _mkpath(d->path, name))) { np_uerror (ENOMEM); goto error; } if (rename (f->path, npath) < 0) { np_uerror (errno); goto error_quiet; } renamed = 1; if (!(ret = np_create_rrename ())) { np_uerror (ENOMEM); goto error; } free (f->path); f->path = npath; return ret; error: errn (np_rerror (), "diod_rename %s@%s:%s to %s/%.*s", fid->user->uname, np_conn_get_client_id (fid->conn), f->path, d->path, name->len, name->str); error_quiet: if (renamed && npath) (void)rename (npath, f->path); if (npath) free (npath); if (ret) free (f); return NULL; }
/* Trename - rename a file, potentially to another directory */ Npfcall* diod_rename (Npfid *fid, Npfid *dfid, Npstr *name) { Npsrv *srv = fid->conn->srv; Fid *f = fid->aux; Fid *d = dfid->aux; Npfcall *ret; Path npath = NULL; int renamed = 0; if ((f->flags & DIOD_FID_FLAGS_ROFS)) { np_uerror (EROFS); goto error_quiet; } if (!(npath = path_append (srv, d->path, name))) { np_uerror (ENOMEM); goto error; } if (rename (path_s (f->path), path_s (npath)) < 0) { np_uerror (errno); goto error_quiet; } renamed = 1; if (!(ret = np_create_rrename ())) { np_uerror (ENOMEM); goto error; } path_decref (srv, f->path); f->path = npath; return ret; error: errn (np_rerror (), "diod_rename %s@%s:%s to %s/%.*s", fid->user->uname, np_conn_get_client_id (fid->conn), path_s (f->path), path_s (d->path), name->len, name->str); error_quiet: if (renamed && npath) (void)rename (path_s (npath), path_s (f->path)); if (npath) path_decref (srv, npath); return NULL; }