|  | @@ -581,21 +581,6 @@ typedef const char *SOCK_OPT_TYPE;
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  #endif /* _MSC_VER */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/* mg_qsort */
 | 
	
		
			
				|  |  | -#if defined(_MSC_VER)
 | 
	
		
			
				|  |  | -/* Windoes uses qsort_s instead of qsort_r */
 | 
	
		
			
				|  |  | -#define mg_qsort(base, num, with, comp, arg)                                   \
 | 
	
		
			
				|  |  | -	qsort_s(base,                                                              \
 | 
	
		
			
				|  |  | -	        num,                                                               \
 | 
	
		
			
				|  |  | -	        with,                                                              \
 | 
	
		
			
				|  |  | -	        (int(__cdecl *)(void *, const void *, const void *))comp,          \
 | 
	
		
			
				|  |  | -	        arg)
 | 
	
		
			
				|  |  | -#elif defined(__linux__)
 | 
	
		
			
				|  |  | -#define mg_qsort(base, num, with, comp, arg) qsort_r(base, num, with, comp, arg)
 | 
	
		
			
				|  |  | -#else
 | 
	
		
			
				|  |  | -#define mg_qsort(base, num, with, comp, arg)
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #define ERRNO ((int)(GetLastError()))
 | 
	
		
			
				|  |  |  #define NO_SOCKLEN_T
 | 
	
	
		
			
				|  | @@ -9850,6 +9835,25 @@ dir_scan_callback(struct de *de, void *data)
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +typedef void (*tsortfunc)(const void *data1, const void *data2, void *userarg);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static void
 | 
	
		
			
				|  |  | +mg_sort(void *data,
 | 
	
		
			
				|  |  | +        size_t elemcount,
 | 
	
		
			
				|  |  | +        size_t elemsize,
 | 
	
		
			
				|  |  | +        tsortfunc sortfunc,
 | 
	
		
			
				|  |  | +        void *userarg)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	/* Do nothing and check if this is the reason for our MacOS crash. This
 | 
	
		
			
				|  |  | +	 * could be because of a different order of arguments for qsort_r between
 | 
	
		
			
				|  |  | +	 * Linux and MacOS:
 | 
	
		
			
				|  |  | +	 * https://stackoverflow.com/questions/39560773/different-declarations-of-qsort-r-on-mac-and-linux
 | 
	
		
			
				|  |  | +	 * Anyway: Why sort at server side if this could be done on client side in
 | 
	
		
			
				|  |  | +	 * Javascript as well?
 | 
	
		
			
				|  |  | +	 */
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  static void
 | 
	
		
			
				|  |  |  handle_directory_request(struct mg_connection *conn, const char *dir)
 | 
	
		
			
				|  |  |  {
 | 
	
	
		
			
				|  | @@ -9943,11 +9947,11 @@ handle_directory_request(struct mg_connection *conn, const char *dir)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	/* Sort and print directory entries */
 | 
	
		
			
				|  |  |  	if (data.entries != NULL) {
 | 
	
		
			
				|  |  | -		mg_qsort(data.entries,
 | 
	
		
			
				|  |  | -		         data.num_entries,
 | 
	
		
			
				|  |  | -		         sizeof(data.entries[0]),
 | 
	
		
			
				|  |  | -		         compare_dir_entries,
 | 
	
		
			
				|  |  | -		         (void *)conn->request_info.query_string);
 | 
	
		
			
				|  |  | +		mg_sort(data.entries,
 | 
	
		
			
				|  |  | +		        data.num_entries,
 | 
	
		
			
				|  |  | +		        sizeof(data.entries[0]),
 | 
	
		
			
				|  |  | +		        compare_dir_entries,
 | 
	
		
			
				|  |  | +		        (void *)conn->request_info.query_string);
 | 
	
		
			
				|  |  |  		for (i = 0; i < data.num_entries; i++) {
 | 
	
		
			
				|  |  |  			print_dir_entry(conn, &data.entries[i]);
 | 
	
		
			
				|  |  |  			mg_free(data.entries[i].file_name);
 |