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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user