src/lib9: support renaming files

This is the standard plan 9 API for renaming files within
a directory.

Change-Id: Iae17af4b201220c7690e73bda88409fd041e7ff5
This commit is contained in:
Roger Peppe
2026-03-25 10:17:42 +01:00
committed by Dan Cross
parent 53b5ac1564
commit 4975178519

View File

@@ -1,6 +1,7 @@
#include <u.h> #include <u.h>
#define NOPLAN9DEFINES #define NOPLAN9DEFINES
#include <libc.h> #include <libc.h>
#include <stdio.h>
#include <sys/time.h> #include <sys/time.h>
#include <utime.h> #include <utime.h>
#include <sys/stat.h> #include <sys/stat.h>
@@ -9,9 +10,10 @@ int
dirwstat(char *file, Dir *dir) dirwstat(char *file, Dir *dir)
{ {
int ret; int ret;
char *newfile, *p;
struct utimbuf ub; struct utimbuf ub;
/* BUG handle more */ /* BUG handle more (e.g. uid, gid, atime) */
ret = 0; ret = 0;
if(~dir->mode != 0){ if(~dir->mode != 0){
if(chmod(file, dir->mode) < 0) if(chmod(file, dir->mode) < 0)
@@ -27,5 +29,20 @@ dirwstat(char *file, Dir *dir)
if(truncate(file, dir->length) < 0) if(truncate(file, dir->length) < 0)
ret = -1; ret = -1;
} }
// Note: rename after all other operations so we can use
// the original name in all other calls.
if(dir->name != nil && dir->name[0] != '\0'){
newfile = nil;
if((p = strrchr(file, '/')) != nil){
newfile = malloc((p-file) + 1 + strlen(dir->name) + 1);
if(newfile == nil)
return -1;
memmove(newfile, file, p-file+1);
strcpy(newfile+(p-file+1), dir->name);
}
if(rename(file, newfile != nil ? newfile : dir->name) < 0)
ret = -1;
free(newfile);
}
return ret; return ret;
} }