aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Scott <nathans@sgi.com>2001-01-17 01:28:13 +0000
committerNathan Scott <nathans@sgi.com>2001-01-17 01:28:13 +0000
commitbfc0410879c08e3687b8fbb018d823a00b1b23da (patch)
tree733960bbb7b378062ce3612cfc107652b1eba03d
parentd1b950542468933ef017c11a858647c06da3d874 (diff)
downloaddmapi-dev-bfc0410879c08e3687b8fbb018d823a00b1b23da.tar.gz
cmd/dmapi/libdm/linux/dmapi_lib.c 1.1 Renamed to cmd/dmapi/libdm/dmapi_lib.c
-rw-r--r--libdm/dmapi_lib.c517
1 files changed, 517 insertions, 0 deletions
diff --git a/libdm/dmapi_lib.c b/libdm/dmapi_lib.c
new file mode 100644
index 0000000..cf536eb
--- /dev/null
+++ b/libdm/dmapi_lib.c
@@ -0,0 +1,517 @@
+/*
+ * Copyright (c) 2000 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 of the GNU 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 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 <sys/stat.h>
+#include <fcntl.h>
+#include <sys/errno.h>
+
+#include <sys/ioctl.h>
+#include <linux/dmapi_kern.h>
+#include <dmapi_lib.h>
+
+#define ARG(y) (long)va_arg(ap,y)
+
+static int dmapi_fd = -1;
+
+int
+dmi_init_service( char *versionstr )
+{
+ dmapi_fd = open( "/dev/dmapi", O_RDWR );
+ if( dmapi_fd == -1 )
+ return -1;
+ return 0;
+}
+
+
+int
+dmi( int opcode, ... )
+{
+ va_list ap;
+ sys_dmapi_args_t u;
+ 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:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(char*);
+ u.arg3 = ARG(dm_sessid_t*);
+ break;
+ case DM_QUERY_SESSION:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(size_t);
+ u.arg3 = ARG(void*);
+ u.arg4 = ARG(size_t*);
+ break;
+ case DM_GETALL_SESSIONS:
+ u.arg1 = ARG(u_int);
+ u.arg2 = ARG(dm_sessid_t*);
+ u.arg3 = ARG(u_int*);
+ break;
+ case DM_DESTROY_SESSION:
+ u.arg1 = ARG(dm_sessid_t);
+ break;
+ case DM_GETALL_TOKENS:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(u_int);
+ u.arg3 = ARG(dm_token_t*);
+ u.arg4 = ARG(u_int*);
+ break;
+ case DM_FIND_EVENTMSG:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(dm_token_t);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(void*);
+ u.arg5 = ARG(size_t*);
+ break;
+/* dm_config */
+ case DM_GET_CONFIG:
+ u.arg1 = ARG(void*);
+ u.arg2 = ARG(size_t);
+ u.arg3 = ARG(dm_config_t);
+ u.arg4 = ARG(dm_size_t*);
+ break;
+ case DM_GET_CONFIG_EVENTS:
+ u.arg1 = ARG(void*);
+ u.arg2 = ARG(size_t);
+ u.arg3 = ARG(u_int);
+ u.arg4 = ARG(dm_eventset_t*);
+ u.arg5 = ARG(u_int*);
+ break;
+/* dm_attr */
+ case DM_GET_FILEATTR:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(u_int);
+ u.arg6 = ARG(dm_stat_t*);
+ break;
+ case DM_SET_FILEATTR:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(u_int);
+ u.arg6 = ARG(dm_fileattr_t*);
+ break;
+/* dm_bulkattr */
+ case DM_INIT_ATTRLOC:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(dm_attrloc_t*);
+ break;
+ case DM_GET_BULKATTR:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(u_int);
+ u.arg6 = ARG(dm_attrloc_t*);
+ u.arg7 = ARG(size_t);
+ u.arg8 = ARG(void*);
+ u.arg9 = ARG(size_t*);
+ break;
+ case DM_GET_DIRATTRS:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(u_int);
+ u.arg6 = ARG(dm_attrloc_t*);
+ u.arg7 = ARG(size_t);
+ u.arg8 = ARG(void*);
+ u.arg9 = ARG(size_t*);
+ break;
+ case DM_GET_BULKALL:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(u_int);
+ u.arg6 = ARG(dm_attrname_t*);
+ u.arg7 = ARG(dm_attrloc_t*);
+ u.arg8 = ARG(size_t);
+ u.arg9 = ARG(void*);
+ u.arg10 = ARG(size_t*);
+ break;
+/* dm_dmattr */
+ case DM_CLEAR_INHERIT:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(dm_attrname_t*);
+ break;
+ case DM_GET_DMATTR:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(dm_attrname_t*);
+ u.arg6 = ARG(size_t);
+ u.arg7 = ARG(void*);
+ u.arg8 = ARG(size_t*);
+ break;
+ case DM_GETALL_DMATTR:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(size_t);
+ u.arg6 = ARG(void*);
+ u.arg7 = ARG(size_t*);
+ break;
+ case DM_GETALL_INHERIT:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(u_int);
+ u.arg6 = ARG(dm_inherit_t*);
+ u.arg7 = ARG(u_int*);
+ break;
+ case DM_REMOVE_DMATTR:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(int);
+ u.arg6 = ARG(dm_attrname_t*);
+ break;
+ case DM_SET_DMATTR:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(dm_attrname_t*);
+ u.arg6 = ARG(int);
+ u.arg7 = ARG(size_t);
+ u.arg8 = ARG(void*);
+ break;
+ case DM_SET_INHERIT:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(dm_attrname_t*);
+ u.arg6 = ARG(mode_t);
+ break;
+ case DM_SET_RETURN_ON_DESTROY:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(dm_attrname_t*);
+ u.arg6 = ARG(dm_boolean_t);
+ break;
+/* dm_event */
+ case DM_GET_EVENTS:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(u_int);
+ u.arg3 = ARG(u_int);
+ u.arg4 = ARG(size_t);
+ u.arg5 = ARG(void*);
+ u.arg6 = ARG(size_t*);
+ break;
+ case DM_RESPOND_EVENT:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(dm_token_t);
+ u.arg3 = ARG(dm_response_t);
+ u.arg4 = ARG(int);
+ u.arg5 = ARG(size_t);
+ u.arg6 = ARG(void*);
+ break;
+ case DM_GET_EVENTLIST:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(u_int);
+ u.arg6 = ARG(dm_eventset_t*);
+ u.arg7 = ARG(u_int*);
+ break;
+ case DM_SET_EVENTLIST:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(dm_eventset_t*);
+ u.arg6 = ARG(u_int);
+ break;
+ case DM_SET_DISP:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(dm_eventset_t*);
+ u.arg6 = ARG(u_int);
+ break;
+ case DM_CREATE_USEREVENT:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(size_t);
+ u.arg3 = ARG(void*);
+ u.arg4 = ARG(dm_token_t*);
+ break;
+ case DM_SEND_MSG:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(dm_msgtype_t);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(void*);
+ break;
+ case DM_MOVE_EVENT:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(dm_token_t);
+ u.arg3 = ARG(dm_sessid_t);
+ u.arg4 = ARG(dm_token_t*);
+ break;
+ case DM_PENDING:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(dm_token_t);
+ u.arg3 = ARG(dm_timestruct_t*);
+ break;
+ case DM_GETALL_DISP:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(size_t);
+ u.arg3 = ARG(void*);
+ u.arg4 = ARG(size_t*);
+ break;
+/* dm_handle */
+ case DM_PATH_TO_HANDLE:
+ u.arg1 = ARG(char*);
+ u.arg2 = ARG(char*);
+ u.arg3 = ARG(size_t*);
+ break;
+ case DM_PATH_TO_FSHANDLE:
+ u.arg1 = ARG(char*);
+ u.arg2 = ARG(char*);
+ u.arg3 = ARG(size_t*);
+ break;
+ case DM_FD_TO_HANDLE:
+ u.arg1 = ARG(int);
+ u.arg2 = ARG(char*);
+ u.arg3 = ARG(size_t*);
+ break;
+ case DM_CREATE_BY_HANDLE:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(void*);
+ u.arg6 = ARG(size_t);
+ u.arg7 = ARG(char*);
+ break;
+ case DM_MKDIR_BY_HANDLE:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(void*);
+ u.arg6 = ARG(size_t);
+ u.arg7 = ARG(char*);
+ break;
+ case DM_SYMLINK_BY_HANDLE:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(void*);
+ u.arg6 = ARG(size_t);
+ u.arg7 = ARG(char*);
+ u.arg8 = ARG(char*);
+ break;
+/* dm_hole */
+ case DM_GET_ALLOCINFO:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(dm_off_t*);
+ u.arg6 = ARG(u_int);
+ u.arg7 = ARG(dm_extent_t*);
+ u.arg8 = ARG(u_int*);
+ break;
+ case DM_PROBE_HOLE:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(dm_off_t);
+ u.arg6 = ARG(dm_size_t);
+ u.arg7 = ARG(dm_off_t*);
+ u.arg8 = ARG(dm_size_t*);
+ break;
+ case DM_PUNCH_HOLE:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(dm_off_t);
+ u.arg6 = ARG(dm_size_t);
+ break;
+/* dm_mountinfo */
+ case DM_GET_MOUNTINFO:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(size_t);
+ u.arg6 = ARG(void*);
+ u.arg7 = ARG(size_t*);
+ break;
+/* dm_rdwr */
+ case DM_READ_INVIS:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(dm_off_t);
+ u.arg6 = ARG(dm_size_t);
+ u.arg7 = ARG(void*);
+ break;
+ case DM_WRITE_INVIS:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(int);
+ u.arg6 = ARG(dm_off_t);
+ u.arg7 = ARG(dm_size_t);
+ u.arg8 = ARG(void*);
+ break;
+ case DM_SYNC_BY_HANDLE:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ break;
+ case DM_GET_DIOINFO:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(dm_dioinfo_t*);
+ break;
+/* dm_region */
+ case DM_GET_REGION:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(u_int);
+ u.arg6 = ARG(dm_region_t*);
+ u.arg7 = ARG(u_int*);
+ break;
+ case DM_SET_REGION:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(u_int);
+ u.arg6 = ARG(dm_region_t*);
+ u.arg7 = ARG(dm_boolean_t*);
+ break;
+/* dm_right */
+ case DM_DOWNGRADE_RIGHT:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ break;
+ case DM_OBJ_REF_HOLD:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(dm_token_t);
+ u.arg3 = ARG(void*);
+ u.arg4 = ARG(size_t);
+ break;
+ case DM_OBJ_REF_QUERY:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(dm_token_t);
+ u.arg3 = ARG(void*);
+ u.arg4 = ARG(size_t);
+ break;
+ case DM_OBJ_REF_RELE:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(dm_token_t);
+ u.arg3 = ARG(void*);
+ u.arg4 = ARG(size_t);
+ break;
+ case DM_QUERY_RIGHT:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(dm_right_t*);
+ break;
+ case DM_RELEASE_RIGHT:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ break;
+ case DM_REQUEST_RIGHT:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ u.arg5 = ARG(u_int);
+ u.arg6 = ARG(dm_right_t);
+ break;
+ case DM_UPGRADE_RIGHT:
+ u.arg1 = ARG(dm_sessid_t);
+ u.arg2 = ARG(void*);
+ u.arg3 = ARG(size_t);
+ u.arg4 = ARG(dm_token_t);
+ break;
+ default:
+ errno = ENOSYS;
+ ret = -1;
+ break;
+ }
+ va_end(ap);
+
+ if( ret != -1 )
+ ret = ioctl( dmapi_fd, opcode, &u );
+
+ return(ret);
+}