X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Flibiam.c;h=3c1299c8bf0f430de4d631fe5764a2d0ba409ece;hb=c56f7675bfb17b3847b38044153e86550ced3c8e;hp=072d10ed9c89c228445842171609b2e7b2bbab17;hpb=d2d56f38da01001c92a09afc6b52b5acbd9bc13c;p=fs%2Flustre-release.git diff --git a/lustre/utils/libiam.c b/lustre/utils/libiam.c index 072d10e..3c1299c 100644 --- a/lustre/utils/libiam.c +++ b/lustre/utils/libiam.c @@ -1,31 +1,45 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: +/* + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. * - * libiam.c - * iam user level library + * 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 version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). * - * Copyright (c) 2006 Cluster File Systems, Inc. - * Author: Wang Di - * Author: Nikita Danilov - * Author: Fan Yong + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + * GPL HEADER END + */ +/* + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Use is subject to license terms. * - * This file is part of the Lustre file system, http://www.lustre.org - * Lustre is a trademark of Cluster File Systems, Inc. + * Copyright (c) 2014, Intel Corporation. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. * - * You may have signed or agreed to another license before downloading - * this software. If so, you are bound by the terms and conditions - * of that agreement, and the following does not apply to you. See the - * LICENSE file included with this distribution for more information. + * lustre/utils/libiam.c * - * If you did not agree to a different license, then this copy of Lustre - * is open source software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. + * iam user level library * - * In either case, Lustre 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 - * license text for more details. + * Author: Wang Di + * Author: Nikita Danilov + * Author: Fan Yong */ #include @@ -42,8 +56,8 @@ #include #endif +#include #include - #include typedef __u32 lvar_hash_t; @@ -101,6 +115,18 @@ enum { LVAR_ROUND = LVAR_PAD - 1 }; +/** + * Stores \a val at \a dst, where the latter is possibly unaligned. Uses + * memcpy(). This macro is needed to avoid dependency of user level tools on + * the kernel headers. + */ +#define STORE_UNALIGNED(val, dst) \ +({ \ + typeof(*(dst)) __val = (val); \ + \ + memcpy(dst, &__val, sizeof *(dst)); \ +}) + static int root_limit(int rootgap, int blocksize, int size) { int limit; @@ -159,9 +185,9 @@ static void lfix_root(void *buf, entry += keysize; /* now @entry points to */ if (ptrsize == 4) - *(u_int32_t *)entry = cpu_to_le32(1); + STORE_UNALIGNED(cpu_to_le32(1), (u_int32_t *)entry); else - *(u_int64_t *)entry = cpu_to_le64(1); + STORE_UNALIGNED(cpu_to_le64(1), (u_int64_t *)entry); } static void lfix_leaf(void *buf, @@ -228,9 +254,9 @@ static void lvar_root(void *buf, entry += sizeof(lvar_hash_t); /* now @entry points to */ if (ptrsize == 4) - *(u_int32_t *)entry = cpu_to_le32(1); + STORE_UNALIGNED(cpu_to_le32(1), (u_int32_t *)entry); else - *(u_int64_t *)entry = cpu_to_le64(1); + STORE_UNALIGNED(cpu_to_le64(1), (u_int64_t *)entry); } static int lvar_esize(int namelen, int recsize) @@ -295,7 +321,7 @@ static unsigned char *packdigit(unsigned char *number) unsigned char *area; unsigned char *scan; - area = calloc(strlen(number) / 2 + 2, sizeof(char)); + area = calloc(strlen((char *)number) / 2 + 2, sizeof(char)); if (area != NULL) { for (scan = area; *number; number += 2, scan++) *scan = (hex2dec(number[0]) << 4) | hex2dec(number[1]); @@ -306,7 +332,7 @@ static unsigned char *packdigit(unsigned char *number) static char *iam_convert(int size, int need_convert, char *source) { char *ptr; - char *opt; + unsigned char *opt; if (source == NULL) return NULL; @@ -316,7 +342,7 @@ static char *iam_convert(int size, int need_convert, char *source) return NULL; if (need_convert) { - opt = packdigit(source); + opt = packdigit((unsigned char*)source); if (opt == NULL) { free(ptr); return NULL; @@ -325,7 +351,7 @@ static char *iam_convert(int size, int need_convert, char *source) free(opt); } } else { - strncpy(ptr, source, size + 1); + strlcpy(ptr, source, size + 1); } return ptr;