22 * PosixHelperFunctions.c
33 *
44 * Created on: Mar 10, 2015
5- * Last Updated on: Nov 02 , 2025
5+ * Last Updated on: Nov 04 , 2025
66 * Author: Will Hedgecock
77 *
88 * Copyright (C) 2012-2025 Fazecast, Inc.
@@ -414,6 +414,35 @@ static void getPortLocation(const char* portDirectory, char* portLocation, int p
414414 free (busnumFile );
415415}
416416
417+ static void getDriverName (const char * directoryToSearch , char * driverName )
418+ {
419+ // Open the directory
420+ DIR * directoryIterator = opendir (directoryToSearch );
421+ if (!directoryIterator )
422+ return ;
423+
424+ // Read all sub-directories in the current directory
425+ struct dirent * directoryEntry = readdir (directoryIterator );
426+ while (directoryEntry )
427+ {
428+ // Check if entry is a valid sub-directory
429+ if (directoryEntry -> d_name [0 ] != '.' )
430+ {
431+ // Get the readable part of the driver name
432+ char * startingPoint = strchr (directoryEntry -> d_name , ':' );
433+ if (startingPoint != NULL )
434+ strcpy (driverName , startingPoint + 1 );
435+ else
436+ strcpy (driverName , directoryEntry -> d_name );
437+ break ;
438+ }
439+ directoryEntry = readdir (directoryIterator );
440+ }
441+
442+ // Close the directory
443+ closedir (directoryIterator );
444+ }
445+
417446static void assignFriendlyName (const char * portDevPath , char * friendlyName )
418447{
419448 // Manually assign a friendly name if the port type is known from its name
@@ -467,7 +496,7 @@ static void assignFriendlyName(const char* portDevPath, char* friendlyName)
467496 }
468497}
469498
470- static void getUsbDetails (const char * fileName , char * basePathEnd , int * vendorID , int * productID , char * serialNumber , char * manufacturer )
499+ static void getUsbDetails (const char * fileName , char * basePathEnd , int * vendorID , int * productID , char * serialNumber , char * manufacturer , char * driverName )
471500{
472501 // Attempt to read the Vendor ID
473502 char * temp = (char * )malloc (8 );
@@ -512,6 +541,11 @@ static void getUsbDetails(const char* fileName, char* basePathEnd, int* vendorID
512541 manufacturer [strcspn (manufacturer , "\r\n" )] = 0 ;
513542 fclose (input );
514543 }
544+
545+ // Attempt to read the Device Driver
546+ strcpy (driverName , "Unknown" );
547+ sprintf (basePathEnd , "driver/module/drivers" );
548+ getDriverName (fileName , driverName );
515549}
516550
517551void searchForComPorts (serialPortVector * comPorts )
@@ -524,6 +558,7 @@ void searchForComPorts(serialPortVector* comPorts)
524558 char * line = (char * )malloc (maxLineSize ), * friendlyName = (char * )malloc (256 );
525559 char * portLocation = (char * )malloc (128 ), * interfaceDescription = (char * )malloc (256 );
526560 char * serialNumber = (char * )malloc (128 ), * manufacturer = (char * )malloc (128 );
561+ char * driverName = (char * )malloc (64 );
527562
528563 // Retrieve the list of /dev/ prefixes for all physical serial ports
529564 retrievePhysicalPortPrefixes (& physicalPortPrefixes );
@@ -536,9 +571,9 @@ void searchForComPorts(serialPortVector* comPorts)
536571 while (directoryEntry )
537572 {
538573 // Ensure that the file name buffer is large enough
539- if ((64 + strlen (directoryEntry -> d_name )) > fileNameMaxLength )
574+ if ((128 + strlen (directoryEntry -> d_name )) > fileNameMaxLength )
540575 {
541- fileNameMaxLength = 64 + strlen (directoryEntry -> d_name );
576+ fileNameMaxLength = 128 + strlen (directoryEntry -> d_name );
542577 fileName = (char * )realloc (fileName , fileNameMaxLength );
543578 }
544579
@@ -602,7 +637,7 @@ void searchForComPorts(serialPortVector* comPorts)
602637 sprintf (basePathEnd , "/device/" );
603638 basePathEnd += 8 ;
604639 }
605- getUsbDetails (fileName , basePathEnd , & vendorID , & productID , serialNumber , manufacturer );
640+ getUsbDetails (fileName , basePathEnd , & vendorID , & productID , serialNumber , manufacturer , driverName );
606641 sprintf (basePathEnd , "../" );
607642 getPortLocation (fileName , portLocation , isPhysical ? physicalPortNumber : -1 );
608643
@@ -639,7 +674,7 @@ void searchForComPorts(serialPortVector* comPorts)
639674 }
640675 if (interfaceDescription [0 ] == '\0' )
641676 strcpy (interfaceDescription , friendlyName );
642- replaceDetails (port , friendlyName , interfaceDescription , portLocation , serialNumber , manufacturer , "TODO" , vendorID , productID , 0 );
677+ replaceDetails (port , friendlyName , interfaceDescription , portLocation , serialNumber , manufacturer , driverName , vendorID , productID , 0 );
643678 }
644679
645680 // Continue port enumeration
@@ -661,7 +696,7 @@ void searchForComPorts(serialPortVector* comPorts)
661696 // Add the port to the list of available ports
662697 strcpy (friendlyName , "Physical Port " );
663698 strcat (friendlyName , directoryEntry -> d_name + 3 );
664- pushBack (comPorts , portDevPath , friendlyName , friendlyName , portLocation , "Unknown" , "Unknown" , "TODO" , -1 , -1 , 0 );
699+ pushBack (comPorts , portDevPath , friendlyName , friendlyName , portLocation , "Unknown" , "Unknown" , driverName , -1 , -1 , 0 );
665700 }
666701 close (fd );
667702 }
@@ -695,7 +730,7 @@ void searchForComPorts(serialPortVector* comPorts)
695730 strcpy (interfaceDescription , friendlyName );
696731
697732 // Add the port to the list of available ports
698- pushBack (comPorts , portDevPath , friendlyName , interfaceDescription , portLocation , serialNumber , manufacturer , "TODO" , vendorID , productID , 0 );
733+ pushBack (comPorts , portDevPath , friendlyName , interfaceDescription , portLocation , serialNumber , manufacturer , driverName , vendorID , productID , 0 );
699734 }
700735
701736 // Read next TTY directory entry
@@ -722,9 +757,9 @@ void searchForComPorts(serialPortVector* comPorts)
722757 strcpy (fileName , "/dev/" );
723758 strcat (fileName , directoryEntry -> d_name );
724759 if (isPtyDevice (fileName ))
725- pushBack (comPorts , fileName , "PTY Device" , "Pseudo-Terminal Device" , "0-0" , "Unknown" , "Unknown" , "TODO " , -1 , -1 , 0 );
760+ pushBack (comPorts , fileName , "PTY Device" , "Pseudo-Terminal Device" , "0-0" , "Unknown" , "Unknown" , "Unknown " , -1 , -1 , 0 );
726761 else if (isBluetoothDevice (fileName ))
727- pushBack (comPorts , fileName , "Bluetooth Device" , "Bluetooth Device" , "0-0" , "Unknown" , "Unknown" , "TODO " , -1 , -1 , 0 );
762+ pushBack (comPorts , fileName , "Bluetooth Device" , "Bluetooth Device" , "0-0" , "Unknown" , "Unknown" , "Unknown " , -1 , -1 , 0 );
728763 else
729764 {
730765 // Copy symlinked port details from its existing TTY enumeration
@@ -748,6 +783,7 @@ void searchForComPorts(serialPortVector* comPorts)
748783 freeStringVector (& physicalPortPrefixes );
749784 if (fileName )
750785 free (fileName );
786+ free (driverName );
751787 free (interfaceDescription );
752788 free (serialNumber );
753789 free (manufacturer );
0 commit comments