File: [Development] / xfs-cmds / dmapi / libdm / dmapi_lib.c (download)
Revision 1.12, Tue Jun 18 21:05:48 2002 UTC (15 years, 4 months ago) by roehrich
Branch: MAIN
CVS Tags: XFS-1_3_0pre1 Changes since 1.11: +5 -4
lines
In dm_handle_to_path(), use getmntent() to walk through the filesystems,
looking for one with an fshandle that matches that of the object we're trying
to find. Open that path so we have a filedescriptor, and hence a valid
vfsmount structure, to give to dm_open_by_handle(). This simplifies a mess on
the kernel side.
No Message Supplied
|
/*
* Copyright (c) 1995, 2001-2002 Silicon Graphics, Inc. All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2.1 of the GNU Lesser General Public License
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it would be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* Further, this software is distributed without any warranty that it is
* free of the rightful claim of any third person regarding infringement
* or the like. Any license provided herein, whether implied or
* otherwise, applies only to this software file. Patent licenses, if
* any, provided herein do not apply to combinations of this program with
* other software, or any other product whatsoever.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, write the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307,
* USA.
*
* Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
* Mountain View, CA 94043, or:
*
* http://www.sgi.com
*
* For further information regarding this notice, see:
*
* http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
*/
#include <fcntl.h>
#include <stdarg.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/errno.h>
#include <stdint.h>
#include <dmapi.h>
#include <dmapi_kern.h>
#include "dmapi_lib.h"
#define Parg(y) (void*)va_arg(ap,y)
#define Uarg(y) (uint64_t)va_arg(ap,y)
static int dmapi_fd = -1;
int
dmi_init_service( char *versionstr )
{
dmapi_fd = open( "/proc/fs/xfs_dmapi_v2", O_RDWR );
if( dmapi_fd == -1 )
return -1;
return 0;
}
int
dmi( int opcode, ... )
{
va_list ap;
sys_dmapi_args_t kargs;
sys_dmapi_args_t *u = &kargs;
int ret = 0;
if( dmapi_fd == -1 ){
/* dm_init_service wasn't called, or failed. The spec
* says my behavior is undefined.
*/
errno = ENOSYS;
return -1;
}
va_start(ap, opcode);
switch( opcode ){
/* dm_session */
case DM_CREATE_SESSION:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(char*);
DM_Parg(u,3) = Parg(dm_sessid_t*);
break;
case DM_QUERY_SESSION:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Uarg(u,2) = Uarg(size_t);
DM_Parg(u,3) = Parg(void*);
DM_Parg(u,4) = Parg(size_t*);
break;
case DM_GETALL_SESSIONS:
DM_Uarg(u,1) = Uarg(u_int);
DM_Parg(u,2) = Parg(dm_sessid_t*);
DM_Parg(u,3) = Parg(u_int*);
break;
case DM_DESTROY_SESSION:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
break;
case DM_GETALL_TOKENS:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Uarg(u,2) = Uarg(u_int);
DM_Parg(u,3) = Parg(dm_token_t*);
DM_Parg(u,4) = Parg(u_int*);
break;
case DM_FIND_EVENTMSG:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Uarg(u,2) = Uarg(dm_token_t);
DM_Uarg(u,3) = Uarg(size_t);
DM_Parg(u,4) = Parg(void*);
DM_Parg(u,5) = Parg(size_t*);
break;
/* dm_config */
case DM_GET_CONFIG:
DM_Parg(u,1) = Parg(void*);
DM_Uarg(u,2) = Uarg(size_t);
DM_Uarg(u,3) = Uarg(dm_config_t);
DM_Parg(u,4) = Parg(dm_size_t*);
break;
case DM_GET_CONFIG_EVENTS:
DM_Parg(u,1) = Parg(void*);
DM_Uarg(u,2) = Uarg(size_t);
DM_Uarg(u,3) = Uarg(u_int);
DM_Parg(u,4) = Parg(dm_eventset_t*);
DM_Parg(u,5) = Parg(u_int*);
break;
/* dm_attr */
case DM_GET_FILEATTR:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Uarg(u,5) = Uarg(u_int);
DM_Parg(u,6) = Parg(dm_stat_t*);
break;
case DM_SET_FILEATTR:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Uarg(u,5) = Uarg(u_int);
DM_Parg(u,6) = Parg(dm_fileattr_t*);
break;
/* dm_bulkattr */
case DM_INIT_ATTRLOC:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Parg(u,5) = Parg(dm_attrloc_t*);
break;
case DM_GET_BULKATTR:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Uarg(u,5) = Uarg(u_int);
DM_Parg(u,6) = Parg(dm_attrloc_t*);
DM_Uarg(u,7) = Uarg(size_t);
DM_Parg(u,8) = Parg(void*);
DM_Parg(u,9) = Parg(size_t*);
break;
case DM_GET_DIRATTRS:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Uarg(u,5) = Uarg(u_int);
DM_Parg(u,6) = Parg(dm_attrloc_t*);
DM_Uarg(u,7) = Uarg(size_t);
DM_Parg(u,8) = Parg(void*);
DM_Parg(u,9) = Parg(size_t*);
break;
case DM_GET_BULKALL:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Uarg(u,5) = Uarg(u_int);
DM_Parg(u,6) = Parg(dm_attrname_t*);
DM_Parg(u,7) = Parg(dm_attrloc_t*);
DM_Uarg(u,8) = Uarg(size_t);
DM_Parg(u,9) = Parg(void*);
DM_Parg(u,10) = Parg(size_t*);
break;
/* dm_dmattr */
case DM_CLEAR_INHERIT:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Parg(u,5) = Parg(dm_attrname_t*);
break;
case DM_GET_DMATTR:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Parg(u,5) = Parg(dm_attrname_t*);
DM_Uarg(u,6) = Uarg(size_t);
DM_Parg(u,7) = Parg(void*);
DM_Parg(u,8) = Parg(size_t*);
break;
case DM_GETALL_DMATTR:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Uarg(u,5) = Uarg(size_t);
DM_Parg(u,6) = Parg(void*);
DM_Parg(u,7) = Parg(size_t*);
break;
case DM_GETALL_INHERIT:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Uarg(u,5) = Uarg(u_int);
DM_Parg(u,6) = Parg(dm_inherit_t*);
DM_Parg(u,7) = Parg(u_int*);
break;
case DM_REMOVE_DMATTR:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Uarg(u,5) = Uarg(int);
DM_Parg(u,6) = Parg(dm_attrname_t*);
break;
case DM_SET_DMATTR:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Parg(u,5) = Parg(dm_attrname_t*);
DM_Uarg(u,6) = Uarg(int);
DM_Uarg(u,7) = Uarg(size_t);
DM_Parg(u,8) = Parg(void*);
break;
case DM_SET_INHERIT:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Parg(u,5) = Parg(dm_attrname_t*);
DM_Uarg(u,6) = Uarg(mode_t);
break;
case DM_SET_RETURN_ON_DESTROY:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Parg(u,5) = Parg(dm_attrname_t*);
DM_Uarg(u,6) = Uarg(dm_boolean_t);
break;
/* dm_event */
case DM_GET_EVENTS:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Uarg(u,2) = Uarg(u_int);
DM_Uarg(u,3) = Uarg(u_int);
DM_Uarg(u,4) = Uarg(size_t);
DM_Parg(u,5) = Parg(void*);
DM_Parg(u,6) = Parg(size_t*);
break;
case DM_RESPOND_EVENT:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Uarg(u,2) = Uarg(dm_token_t);
DM_Uarg(u,3) = Uarg(dm_response_t);
DM_Uarg(u,4) = Uarg(int);
DM_Uarg(u,5) = Uarg(size_t);
DM_Parg(u,6) = Parg(void*);
break;
case DM_GET_EVENTLIST:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Uarg(u,5) = Uarg(u_int);
DM_Parg(u,6) = Parg(dm_eventset_t*);
DM_Parg(u,7) = Parg(u_int*);
break;
case DM_SET_EVENTLIST:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Parg(u,5) = Parg(dm_eventset_t*);
DM_Uarg(u,6) = Uarg(u_int);
break;
case DM_SET_DISP:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Parg(u,5) = Parg(dm_eventset_t*);
DM_Uarg(u,6) = Uarg(u_int);
break;
case DM_CREATE_USEREVENT:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Uarg(u,2) = Uarg(size_t);
DM_Parg(u,3) = Parg(void*);
DM_Parg(u,4) = Parg(dm_token_t*);
break;
case DM_SEND_MSG:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Uarg(u,2) = Uarg(dm_msgtype_t);
DM_Uarg(u,3) = Uarg(size_t);
DM_Parg(u,4) = Parg(void*);
break;
case DM_MOVE_EVENT:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Uarg(u,2) = Uarg(dm_token_t);
DM_Uarg(u,3) = Uarg(dm_sessid_t);
DM_Parg(u,4) = Parg(dm_token_t*);
break;
case DM_PENDING:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Uarg(u,2) = Uarg(dm_token_t);
DM_Parg(u,3) = Parg(dm_timestruct_t*);
break;
case DM_GETALL_DISP:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Uarg(u,2) = Uarg(size_t);
DM_Parg(u,3) = Parg(void*);
DM_Parg(u,4) = Parg(size_t*);
break;
/* dm_handle */
case DM_PATH_TO_HANDLE:
DM_Parg(u,1) = Parg(char*);
DM_Parg(u,2) = Parg(char*);
DM_Parg(u,3) = Parg(size_t*);
break;
case DM_PATH_TO_FSHANDLE:
DM_Parg(u,1) = Parg(char*);
DM_Parg(u,2) = Parg(char*);
DM_Parg(u,3) = Parg(size_t*);
break;
case DM_FD_TO_HANDLE:
DM_Uarg(u,1) = Uarg(int);
DM_Parg(u,2) = Parg(char*);
DM_Parg(u,3) = Parg(size_t*);
break;
case DM_CREATE_BY_HANDLE:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Parg(u,5) = Parg(void*);
DM_Uarg(u,6) = Uarg(size_t);
DM_Parg(u,7) = Parg(char*);
break;
case DM_MKDIR_BY_HANDLE:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Parg(u,5) = Parg(void*);
DM_Uarg(u,6) = Uarg(size_t);
DM_Parg(u,7) = Parg(char*);
break;
case DM_SYMLINK_BY_HANDLE:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Parg(u,5) = Parg(void*);
DM_Uarg(u,6) = Uarg(size_t);
DM_Parg(u,7) = Parg(char*);
DM_Parg(u,8) = Parg(char*);
break;
/* dm_handle2path */
case DM_OPEN_BY_HANDLE:
DM_Uarg(u,1) = Uarg(unsigned int);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(int);
break;
/* dm_hole */
case DM_GET_ALLOCINFO:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Parg(u,5) = Parg(dm_off_t*);
DM_Uarg(u,6) = Uarg(u_int);
DM_Parg(u,7) = Parg(dm_extent_t*);
DM_Parg(u,8) = Parg(u_int*);
break;
case DM_PROBE_HOLE:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Uarg(u,5) = Uarg(dm_off_t);
DM_Uarg(u,6) = Uarg(dm_size_t);
DM_Parg(u,7) = Parg(dm_off_t*);
DM_Parg(u,8) = Parg(dm_size_t*);
break;
case DM_PUNCH_HOLE:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Uarg(u,5) = Uarg(dm_off_t);
DM_Uarg(u,6) = Uarg(dm_size_t);
break;
/* dm_mountinfo */
case DM_GET_MOUNTINFO:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Uarg(u,5) = Uarg(size_t);
DM_Parg(u,6) = Parg(void*);
DM_Parg(u,7) = Parg(size_t*);
break;
/* dm_rdwr */
case DM_READ_INVIS:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Uarg(u,5) = Uarg(dm_off_t);
DM_Uarg(u,6) = Uarg(dm_size_t);
DM_Parg(u,7) = Parg(void*);
break;
case DM_WRITE_INVIS:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Uarg(u,5) = Uarg(int);
DM_Uarg(u,6) = Uarg(dm_off_t);
DM_Uarg(u,7) = Uarg(dm_size_t);
DM_Parg(u,8) = Parg(void*);
break;
case DM_SYNC_BY_HANDLE:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
break;
case DM_GET_DIOINFO:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Parg(u,5) = Parg(dm_dioinfo_t*);
break;
/* dm_region */
case DM_GET_REGION:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Uarg(u,5) = Uarg(u_int);
DM_Parg(u,6) = Parg(dm_region_t*);
DM_Parg(u,7) = Parg(u_int*);
break;
case DM_SET_REGION:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Uarg(u,5) = Uarg(u_int);
DM_Parg(u,6) = Parg(dm_region_t*);
DM_Parg(u,7) = Parg(dm_boolean_t*);
break;
/* dm_right */
case DM_DOWNGRADE_RIGHT:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
break;
case DM_OBJ_REF_HOLD:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Uarg(u,2) = Uarg(dm_token_t);
DM_Parg(u,3) = Parg(void*);
DM_Uarg(u,4) = Uarg(size_t);
break;
case DM_OBJ_REF_QUERY:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Uarg(u,2) = Uarg(dm_token_t);
DM_Parg(u,3) = Parg(void*);
DM_Uarg(u,4) = Uarg(size_t);
break;
case DM_OBJ_REF_RELE:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Uarg(u,2) = Uarg(dm_token_t);
DM_Parg(u,3) = Parg(void*);
DM_Uarg(u,4) = Uarg(size_t);
break;
case DM_QUERY_RIGHT:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Parg(u,5) = Parg(dm_right_t*);
break;
case DM_RELEASE_RIGHT:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
break;
case DM_REQUEST_RIGHT:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
DM_Uarg(u,5) = Uarg(u_int);
DM_Uarg(u,6) = Uarg(dm_right_t);
break;
case DM_UPGRADE_RIGHT:
DM_Uarg(u,1) = Uarg(dm_sessid_t);
DM_Parg(u,2) = Parg(void*);
DM_Uarg(u,3) = Uarg(size_t);
DM_Uarg(u,4) = Uarg(dm_token_t);
break;
default:
errno = ENOSYS;
ret = -1;
break;
}
va_end(ap);
if( ret != -1 )
ret = ioctl( dmapi_fd, opcode, &kargs );
return(ret);
}