| /* |
| * mdadm - manage Linux "md" devices aka RAID arrays. |
| * |
| * Copyright (C) 2001-2013 Neil Brown <neilb@suse.de> |
| * |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| * |
| * Author: Neil Brown |
| * Email: <neilb@suse.de> |
| */ |
| |
| #include <string.h> |
| |
| const int uuid_zero[4] = { 0, 0, 0, 0 }; |
| |
| int same_uuid(int a[4], int b[4], int swapuuid) |
| { |
| if (swapuuid) { |
| /* parse uuids are hostendian. |
| * uuid's from some superblocks are big-ending |
| * if there is a difference, we need to swap.. |
| */ |
| unsigned char *ac = (unsigned char *)a; |
| unsigned char *bc = (unsigned char *)b; |
| int i; |
| for (i = 0; i < 16; i += 4) { |
| if (ac[i+0] != bc[i+3] || |
| ac[i+1] != bc[i+2] || |
| ac[i+2] != bc[i+1] || |
| ac[i+3] != bc[i+0]) |
| return 0; |
| } |
| return 1; |
| } else { |
| if (a[0]==b[0] && |
| a[1]==b[1] && |
| a[2]==b[2] && |
| a[3]==b[3]) |
| return 1; |
| return 0; |
| } |
| } |
| |
| void copy_uuid(void *a, int b[4], int swapuuid) |
| { |
| if (swapuuid) { |
| /* parse uuids are hostendian. |
| * uuid's from some superblocks are big-ending |
| * if there is a difference, we need to swap.. |
| */ |
| unsigned char *ac = (unsigned char *)a; |
| unsigned char *bc = (unsigned char *)b; |
| int i; |
| for (i = 0; i < 16; i += 4) { |
| ac[i+0] = bc[i+3]; |
| ac[i+1] = bc[i+2]; |
| ac[i+2] = bc[i+1]; |
| ac[i+3] = bc[i+0]; |
| } |
| } else |
| memcpy(a, b, 16); |
| } |
| |
| /* |
| * Parse a 128 bit uuid in 4 integers |
| * format is 32 hexx nibbles with options :.<space> separator |
| * If not exactly 32 hex digits are found, return 0 |
| * else return 1 |
| */ |
| int parse_uuid(char *str, int uuid[4]) |
| { |
| int hit = 0; /* number of Hex digIT */ |
| int i; |
| char c; |
| for (i = 0; i < 4; i++) |
| uuid[i] = 0; |
| |
| while ((c = *str++) != 0) { |
| int n; |
| if (c >= '0' && c <= '9') |
| n = c-'0'; |
| else if (c >= 'a' && c <= 'f') |
| n = 10 + c - 'a'; |
| else if (c >= 'A' && c <= 'F') |
| n = 10 + c - 'A'; |
| else if (strchr(":. -", c)) |
| continue; |
| else return 0; |
| |
| if (hit<32) { |
| uuid[hit/8] <<= 4; |
| uuid[hit/8] += n; |
| } |
| hit++; |
| } |
| if (hit == 32) |
| return 1; |
| return 0; |
| } |