c program for linux, to get a serial number of the device, for a non-root user [closed]

StackOverflow https://stackoverflow.com/questions/21211920

  •  29-09-2022
  •  | 
  •  

Question

I tried ioctl with HDIO_GET_IDENTITY to determine the serial number of the hard disk, but it requires root privileges.

Please help me to write a program in c to get the serial number of the device (hdd, cpu, mb) or mac address, which does not require root permissions.

Was it helpful?

Solution

Why don't you use the MAC address as unique computer id. Here is the code to get MAC address of one of the interface. The code below basically reads name of all the available interfaces and then loops through them to get the MAC address of the first one excluding the loopback interface.

int main()
{
struct ifreq ifr;
struct ifconf ifc;
char buf[1024];
int success = 0;

int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
if (sock == -1) { /* handle error*/ };

ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) { /* handle error */ }

struct ifreq* it = ifc.ifc_req;
const struct ifreq* const end = it + (ifc.ifc_len / sizeof(struct ifreq));

for (; it != end; ++it) {
    strcpy(ifr.ifr_name, it->ifr_name);
    if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {
        if (! (ifr.ifr_flags & IFF_LOOPBACK)) { // don't count loopback
            if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {
                success = 1;
                break;
            }
        }
    }
    else { /* handle error */ }
}

unsigned char mac_address[6];

if (success) memcpy(mac_address, ifr.ifr_hwaddr.sa_data, 6);
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top