Home | History | Annotate | Download | only in gen
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 /*	Copyright (c) 1988 AT&T	*/
     28 /*	  All Rights Reserved  	*/
     29 
     30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     31 
     32 #pragma weak _ftok = ftok
     33 
     34 #include "lint.h"
     35 #include "libc.h"
     36 #include <sys/types.h>
     37 #include <sys/stat.h>
     38 #include <sys/mkdev.h>
     39 #include <sys/nvpair.h>
     40 #include <fcntl.h>
     41 #include <attr.h>
     42 
     43 key_t
     44 ftok(const char *path, int id)
     45 {
     46 	struct stat64 st;
     47 	nvlist_t *nvp;
     48 	uint32_t devpiece;
     49 	int error;
     50 
     51 	if (stat64(path, &st) < 0)
     52 		return ((key_t)-1);
     53 
     54 	/*
     55 	 * if getattrat works then extract the FSID from the nvlist
     56 	 * otherwise, just fall back and use the value from the stat data
     57 	 */
     58 	if ((error = getattrat(AT_FDCWD, XATTR_VIEW_READONLY,
     59 	    path, &nvp)) == 0) {
     60 		uint64_t value;
     61 
     62 		if ((error = libc_nvlist_lookup_uint64(nvp,
     63 		    A_FSID, &value)) == 0)
     64 			devpiece = value & 0xfff;
     65 		libc_nvlist_free(nvp);
     66 	}
     67 
     68 	if (error)
     69 		devpiece = st.st_dev & 0xfff;
     70 
     71 	return ((key_t)((key_t)id << 24 | devpiece << 12 |
     72 	    ((uint32_t)st.st_ino & 0x0fff)));
     73 }
     74