plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

create.c (774B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <fcall.h>
      4 #include <9pclient.h>
      5 #include "fsimpl.h"
      6 
      7 int
      8 fsfcreate(CFid *fid, char *name, int mode, ulong perm)
      9 {
     10 	Fcall tx, rx;
     11 
     12 	tx.type = Tcreate;
     13 	tx.name = name;
     14 	tx.fid = fid->fid;
     15 	tx.mode = mode;
     16 	tx.perm = perm;
     17 	tx.extension = nil;
     18 	if(_fsrpc(fid->fs, &tx, &rx, 0) < 0)
     19 		return -1;
     20 	fid->mode = mode;
     21 	return 0;
     22 }
     23 
     24 CFid*
     25 fscreate(CFsys *fs, char *name, int mode, ulong perm)
     26 {
     27 	CFid *fid;
     28 	char *p, *dir, *elem;
     29 
     30 	p = strrchr(name, '/');
     31 	if(p == nil){
     32 		dir = "";
     33 		elem = name;
     34 	}else{
     35 		dir = name;
     36 		*p = 0;
     37 		elem = p+1;
     38 	}
     39 
     40 	if((fid = fswalk(fs->root, dir)) == nil){
     41 		if(p)
     42 			*p = '/';
     43 		return nil;
     44 	}
     45 	if(p)
     46 		*p = '/';
     47 	if(fsfcreate(fid, elem, mode, perm) < 0){
     48 		fsclose(fid);
     49 		return nil;
     50 	}
     51 	return fid;
     52 }