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
  •  | 
  •  

문제

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.

도움이 되었습니까?

해결책

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);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top