+int yaffs_link(const YCHAR *oldpath, const YCHAR *newpath)
+{
+ // Creates a link called newpath to existing oldpath
+ yaffs_Object *obj = NULL;
+ yaffs_Object *target = NULL;
+ int retVal = 0;
+ int newNameLength = 0;
+
+
+ yaffsfs_Lock();
+
+ obj = yaffsfs_FindObject(NULL,oldpath,0);
+ target = yaffsfs_FindObject(NULL,newpath,0);
+
+ if(!obj) {
+ yaffsfs_SetError(-ENOENT);
+ retVal = -1;
+ } else if(obj->myDev->readOnly){
+ yaffsfs_SetError(-EINVAL);
+ retVal= -1;
+ } else if(target) {
+ yaffsfs_SetError(-EEXIST);
+ retVal = -1;
+ } else {
+ yaffs_Object *newdir = NULL;
+ yaffs_Object *link = NULL;
+
+ YCHAR *newname;
+
+ newdir = yaffsfs_FindDirectory(NULL,newpath,&newname,0);
+
+ if(!newdir){
+ yaffsfs_SetError(-ENOTDIR);
+ retVal = -1;
+ }else if(newdir->myDev != obj->myDev){
+ yaffsfs_SetError(-EXDEV);
+ retVal = -1;
+ }
+
+ newNameLength = yaffs_strnlen(newname,YAFFS_MAX_NAME_LENGTH+1);
+
+ if(newNameLength == 0){
+ yaffsfs_SetError(-ENOENT);
+ retVal = -1;
+ } else if (newNameLength > YAFFS_MAX_NAME_LENGTH){
+ yaffsfs_SetError(-ENAMETOOLONG);
+ retVal = -1;
+ }
+
+ if(retVal == 0) {
+ link = yaffs_Link(newdir,newname,obj);
+ if(link)
+ retVal = 0;
+ else{
+ yaffsfs_SetError(-ENOSPC);
+ retVal = -1;
+ }
+
+ }
+ }
+ yaffsfs_Unlock();
+
+ return retVal;
+}
+
+int yaffs_mknod(const YCHAR *pathname, mode_t mode, dev_t dev)
+{
+ return -1;
+}