[pulseaudio-discuss] [PATCH] core: Provide a replacement for scandir on Win32

Vadim Troshchinskiy vtroshchinskiy at qindel.com
Fri Aug 4 13:05:31 UTC 2017


В письме от четверг, 3 августа 2017 г. 11:08:44 CEST пользователь Tanu Kaskinen написал:
> Thanks for the patch! It would be good to get this in the upcoming
> release. Some complaints below.

Hello, I have made the fixes, and also fixed a few warnings.



---
 src/pulsecore/conf-parser.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/src/pulsecore/conf-parser.c b/src/pulsecore/conf-parser.c
index 60345adf..c82c19c1 100644
--- a/src/pulsecore/conf-parser.c
+++ b/src/pulsecore/conf-parser.c
@@ -153,9 +153,11 @@ static int parse_line(pa_config_parser_state *state) {
         return normal_assignment(state);
 }
 
+#ifndef OS_IS_WIN32
 static int conf_filter(const struct dirent *entry) {
     return pa_endswith(entry->d_name, ".conf");
 }
+#endif
 
 /* Go through the file and parse each line */
 int pa_config_parse(const char *filename, FILE *f, const pa_config_item *t, pa_proplist *proplist, bool use_dot_d,
@@ -218,6 +220,45 @@ finish:
         fclose(f);
 
     if (use_dot_d) {
+#ifdef OS_IS_WIN32
+        char *dir_name = pa_sprintf_malloc("%s.d", filename);
+        char *pattern = pa_sprintf_malloc("%s\\*.conf", dir_name);
+        HANDLE fh;
+        WIN32_FIND_DATA wfd;
+
+        fh = FindFirstFile(pattern, &wfd);
+        if (fh != INVALID_HANDLE_VALUE) {
+            do {
+                if(!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
+                    char *filename2 = pa_sprintf_malloc("%s\\%s", dir_name, wfd.cFileName);
+                    pa_config_parse(filename2, NULL, t, proplist, false, userdata);
+                    pa_xfree(filename2);
+                }
+            } while(FindNextFile(fh, &wfd));
+            FindClose(fh);
+        } else {
+            DWORD err = GetLastError();
+
+            if (err == ERROR_PATH_NOT_FOUND) {
+                pa_log_debug("Pattern %s did not match any files, ignoring.", pattern);
+            } else {
+                LPVOID msgbuf;
+                DWORD fret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+                                           NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&msgbuf, 0, NULL);
+
+                if (fret != 0) {
+                    pa_log_warn("FindFirstFile(%s) failed with error %ld (%s), ignoring.", pattern, err, (char*)msgbuf);
+                    LocalFree(msgbuf);
+                } else {
+                    pa_log_warn("FindFirstFile(%s) failed with error %ld, ignoring.", pattern, err);
+                    pa_log_warn("FormatMessage failed with error %ld", GetLastError());
+                }
+            }
+        }
+
+        pa_xfree(pattern);
+        pa_xfree(dir_name);
+#else
         char *dir_name;
         int n;
         struct dirent **entries = NULL;
@@ -247,6 +288,7 @@ finish:
         }
 
         pa_xfree(dir_name);
+#endif
     }
 
     return r;
-- 
2.13.3




-- 
Vadim Troshchinskiy
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/pulseaudio-discuss/attachments/20170804/0c49598d/attachment.sig>


More information about the pulseaudio-discuss mailing list