83 lines
2.5 KiB
C
83 lines
2.5 KiB
C
/*
|
|
** Copyright 2007, The Android Open Source Project
|
|
**
|
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
|
** you may not use this file except in compliance with the License.
|
|
** You may obtain a copy of the License at
|
|
**
|
|
** http://www.apache.org/licenses/LICENSE-2.0
|
|
**
|
|
** Unless required by applicable law or agreed to in writing, software
|
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
** See the License for the specific language governing permissions and
|
|
** limitations under the License.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <cutils/cpu_info.h>
|
|
|
|
// we cache the serial number here.
|
|
// this is also used as a fgets() line buffer when we are reading /proc/cpuinfo
|
|
static char serial_number[100] = { 0 };
|
|
|
|
extern const char* get_cpu_serial_number(void)
|
|
{
|
|
if (serial_number[0] == 0)
|
|
{
|
|
FILE* file;
|
|
char* chp, *end;
|
|
char* whitespace;
|
|
|
|
// read serial number from /proc/cpuinfo
|
|
file = fopen("proc/cpuinfo", "r");
|
|
if (! file)
|
|
return NULL;
|
|
|
|
while ((chp = fgets(serial_number, sizeof(serial_number), file)) != NULL)
|
|
{
|
|
// look for something like "Serial : 999206122a03591c"
|
|
|
|
if (strncmp(chp, "Serial", 6) != 0)
|
|
continue;
|
|
|
|
chp = strchr(chp, ':');
|
|
if (!chp)
|
|
continue;
|
|
|
|
// skip colon and whitespace
|
|
while ( *(++chp) == ' ') {}
|
|
|
|
// truncate trailing whitespace
|
|
end = chp;
|
|
while (*end && *end != ' ' && *end != '\t' && *end != '\n' && *end != '\r')
|
|
++end;
|
|
*end = 0;
|
|
|
|
whitespace = strchr(chp, ' ');
|
|
if (whitespace)
|
|
*whitespace = 0;
|
|
whitespace = strchr(chp, '\t');
|
|
if (whitespace)
|
|
*whitespace = 0;
|
|
whitespace = strchr(chp, '\r');
|
|
if (whitespace)
|
|
*whitespace = 0;
|
|
whitespace = strchr(chp, '\n');
|
|
if (whitespace)
|
|
*whitespace = 0;
|
|
|
|
// shift serial number to beginning of the buffer
|
|
memmove(serial_number, chp, strlen(chp) + 1);
|
|
break;
|
|
}
|
|
|
|
fclose(file);
|
|
}
|
|
|
|
return (serial_number[0] ? serial_number : NULL);
|
|
}
|