From d7ce700605e1af0e455e31ec11f19ff21d26b525 Mon Sep 17 00:00:00 2001 From: darylm503 Date: Sat, 30 Jul 2011 00:30:44 +0000 Subject: Add Socket Libraries. Add Posix functions for porting compatibility. Fix compliance issues with ISO/IEC 9899:199409 New Functions: setenv(), fparseln(), GetFileNameFromPath(), rename(), realpath(), setprogname(), getprogname(), strlcat(), strlcpy(), strsep(), setitimer(), getitimer(), timegm(), getopt(), basename(), mkstemp(), ffs(), vsnprintf(), snprintf(), getpass(), usleep(), select(), writev(), strcasecmp(), getcwd(), chdir(), tcgetpgrp(), getpgrp(), gettimeofday(), bcopy(), git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12061 6f19259b-4bc3-4df7-8a09-765794883524 --- StdLib/LibC/Uefi/Devices/Utility/DevGenisis.c | 18 ++++---- StdLib/LibC/Uefi/Devices/Utility/Path.c | 59 ++++++++++++++++++++++++--- 2 files changed, 63 insertions(+), 14 deletions(-) (limited to 'StdLib/LibC/Uefi/Devices/Utility') diff --git a/StdLib/LibC/Uefi/Devices/Utility/DevGenisis.c b/StdLib/LibC/Uefi/Devices/Utility/DevGenisis.c index 2bdb33ac53..6510ce7747 100644 --- a/StdLib/LibC/Uefi/Devices/Utility/DevGenisis.c +++ b/StdLib/LibC/Uefi/Devices/Utility/DevGenisis.c @@ -31,33 +31,33 @@ DeviceNode *daCurrentDevice = NULL; ///< Device currently being accessed fnullop_* Does nothing and returns success. fbadop_* Does nothing and returns EPERM */ -int fnullop_fcntl (struct __filedes *filp, UINT32 Cmd, void *p3, void *p4) +int EFIAPI fnullop_fcntl (struct __filedes *filp, UINT32 Cmd, void *p3, void *p4) { return 0; } -short fnullop_poll (struct __filedes *filp, short Events) +short EFIAPI fnullop_poll (struct __filedes *filp, short Events) { return ((POLLIN | POLLRDNORM | POLLOUT) & Events); } -int fnullop_flush (struct __filedes *filp) +int EFIAPI fnullop_flush (struct __filedes *filp) { return 0; } -int fbadop_stat (struct __filedes *filp, struct stat *StatBuf, void *Buf) +int EFIAPI fbadop_stat (struct __filedes *filp, struct stat *StatBuf, void *Buf) { return -EPERM; } -int fbadop_ioctl (struct __filedes *filp, ULONGN Cmd, void *argp) +int EFIAPI fbadop_ioctl (struct __filedes *filp, ULONGN Cmd, void *argp) { return -EPERM; } -int fbadop_delete (struct __filedes *filp) +int EFIAPI fbadop_delete (struct __filedes *filp) { return -EPERM; } -int fbadop_mkdir (const char *path, __mode_t perms) +int EFIAPI fbadop_mkdir (const char *path, __mode_t perms) { return -EPERM; } -int fbadop_rename (const char *from, const char *to) +int EFIAPI fbadop_rename (const char *from, const char *to) { return -EPERM; } -int fbadop_rmdir (struct __filedes *filp) +int EFIAPI fbadop_rmdir (struct __filedes *filp) { return -EPERM; } /** Add a new device to the device list. diff --git a/StdLib/LibC/Uefi/Devices/Utility/Path.c b/StdLib/LibC/Uefi/Devices/Utility/Path.c index 92bb1a20b7..96392e018d 100644 --- a/StdLib/LibC/Uefi/Devices/Utility/Path.c +++ b/StdLib/LibC/Uefi/Devices/Utility/Path.c @@ -248,10 +248,16 @@ PathAlias( /** Parse a path producing the target device, device instance, and file path. + It is the caller's responsibility to free() FullPath and MapPath when they + are no longer needed. + @param[in] path @param[out] FullPath @param[out] DevNode @param[out] Which + @param[out] MapPath OPTIONAL. If not NULL, it points to the place to save a pointer + to the extracted map name. If the path didn't have a map name, + then *MapPath is set to NULL. @retval RETURN_SUCCESS The path was parsed successfully. @retval RETURN_NOT_FOUND The path does not map to a valid device. @@ -266,7 +272,8 @@ ParsePath( IN const char *path, OUT wchar_t **FullPath, OUT DeviceNode **DevNode, - OUT int *Which + OUT int *Which, + OUT wchar_t **MapPath ) { int MapLen; @@ -301,7 +308,7 @@ reclassify: // Get the Map Name, including the trailing ':'. */ MPath = calloc(MapLen+2, sizeof(wchar_t)); if(MPath != NULL) { - wmemcpy(MPath, WPath, MapLen+2); + wmemcpy(MPath, WPath, MapLen+1); } else { errno = ENOMEM; @@ -346,6 +353,12 @@ reclassify: if(!RETURN_ERROR(Status)) { *FullPath = WPath; *Which = Instance; + if(MapPath != NULL) { + *MapPath = MPath; + } + else if(MPath != NULL) { + free(MPath); /* Caller doesn't want it so let MPath go free */ + } /* At this point, WPath is an absolute path, MPath is either NULL or points to the Map Name, @@ -359,6 +372,9 @@ reclassify: if(Node != NULL) { Status = RETURN_SUCCESS; } + else { + Status = RETURN_NOT_FOUND; + } } else { /* This is a mapped path. */ @@ -375,8 +391,41 @@ reclassify: *DevNode = Node; } } - if(MPath != NULL) { - free(MPath); // We don't need this any more. - } return Status; } + +/** + Parses a normalized wide character path and returns a pointer to the entry + following the last \. If a \ is not found in the path the return value will + be the same as the input value. All error conditions return NULL. + + The behavior when passing in a path that has not been normalized is undefined. + + @param Path - A pointer to a wide character string containing a path to a + directory or a file. + + @return Pointer to the file name or terminal directory. NULL if an error is + detected. +**/ +wchar_t * +EFIAPI +GetFileNameFromPath ( + const wchar_t *Path + ) +{ + wchar_t *Tail; + + if (Path == NULL) { + return NULL; + } + + Tail = wcsrchr(Path, L'\\'); + if(Tail == NULL) { + Tail = (wchar_t *) Path; + } else { + // Move to the next character after the '\\' to get the file name. + Tail++; + } + + return Tail; +} -- cgit v1.2.3