115 ret = com; |
115 ret = com; |
116 } |
116 } |
117 else //It's a special file, directory or normal file |
117 else //It's a special file, directory or normal file |
118 { |
118 { |
119 RFs& rfs = Backend()->FileSession(); |
119 RFs& rfs = Backend()->FileSession(); |
120 TSpecialFileType fileType = _SystemSpecialFileBasedFilePath(name, err, rfs); |
120 TUint attribval; |
121 if(fileType == EFileTypeMkFifo) //special file, FIFO |
121 TFullName fullName; |
122 { |
122 err = GetFullFile(fullName, (const TText16*)name, rfs); |
123 ret = CFileTable::FifoOpen(name, mode, perms, err); |
123 if(err != KErrNone) |
124 } |
124 return NULL; |
125 else if(fileType == EFileTypeSymLink) //special file, symlink |
125 int ret1 = rfs.Att(fullName, attribval); |
126 { |
126 if (ret1 == 0 && ((attribval & (KEntryAttHidden | KEntryAttSystem))== (KEntryAttHidden | KEntryAttSystem))) |
127 ret = CFileTable::LinkOpen(name, mode, perms, err, rfs); |
127 { |
128 } |
128 TSpecialFileType fileType = _SystemSpecialFileBasedFilePath(name, err, rfs); |
|
129 if(fileType == EFileTypeMkFifo) //special file, FIFO |
|
130 { |
|
131 ret = CFileTable::FifoOpen(name, mode, perms, err); |
|
132 } |
|
133 else if(fileType == EFileTypeSymLink) //special file, symlink |
|
134 { |
|
135 ret = CFileTable::LinkOpen(name, mode, perms, err, rfs); |
|
136 } |
|
137 } |
129 else //normal file or directory |
138 else //normal file or directory |
130 { |
139 { |
131 TFullName fullName; |
140 //Try opening as a file |
132 err = GetFullFile(fullName, (const TText16*)name, rfs); |
|
133 if(err != KErrNone) |
|
134 return NULL; |
|
135 |
|
136 //Try opening as a file |
|
137 CFileDesc* file = new CFileDesc; |
141 CFileDesc* file = new CFileDesc; |
138 if(file != NULL) |
142 if(file != NULL) |
139 { |
143 { |
140 err = file->Open(rfs, fullName, mode, perms); |
144 err = file->Open(rfs, fullName, mode, perms); |
141 if(err != KErrNone) |
145 if(err != KErrNone) |
632 // Replace = open a new file, zapping the existing one if necessary |
636 // Replace = open a new file, zapping the existing one if necessary |
633 |
637 |
634 int mapped=MapMode(mode, fMode); |
638 int mapped=MapMode(mode, fMode); |
635 // if the file is in \sys, use EFileShareReadersOnly not EFileShareReadersOrWriters |
639 // if the file is in \sys, use EFileShareReadersOnly not EFileShareReadersOrWriters |
636 TParsePtrC pars(aName); |
640 TParsePtrC pars(aName); |
637 if (pars.Path().FindC(_L("\\SYS\\")) == 0) |
641 if (pars.Path().FindF(_L("\\SYS\\")) == 0) |
638 { |
642 { |
639 fMode &= ~EFileShareReadersOrWriters; |
643 fMode &= ~EFileShareReadersOrWriters; |
640 fMode |= EFileShareReadersOnly; |
644 fMode |= EFileShareReadersOnly; |
641 } |
645 } |
642 |
646 |
643 // if the file is in \resource, dont use EFileShareReadersOrWriters |
647 // if the file is in \resource, dont use EFileShareReadersOrWriters |
644 if (pars.Path().FindC(_L("\\resource\\")) == 0) |
648 if (pars.Path().FindF(_L("\\resource\\")) == 0) |
645 { |
649 { |
646 fMode &= ~EFileShareReadersOrWriters; |
650 fMode &= ~EFileShareReadersOrWriters; |
647 fMode |= EFileShareReadersOnly; |
651 fMode |= EFileShareReadersOnly; |
648 } |
652 } |
649 |
653 |