All pastes #2067859 Raw Edit

vsys.c

public c v1 · immutable
#2067859 ·published 2011-05-23 21:43 UTC
rendered paste body
/* * Copyright 2000, International Business Machines Corporation and others. * All Rights Reserved. * * This software has been released under the terms of the IBM Public * License.  For details, see the LICENSE file in the top-level source * directory or online at http://www.openafs.org/dl/license10.html */#include <afsconfig.h>#include <afs/param.h>#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <string.h>#ifdef HAVE_UNISTD_H#include <unistd.h>#endif#include <sys/types.h>#include <sys/stat.h>#ifdef HAVE_SYS_FCNTL_H#include <sys/fcntl.h>#endif#ifdef HAVE_STDINT_H# include <stdint.h>#endif#ifdef HAVE_SYS_IOCTL_H# include <sys/ioctl.h>#endif#include <netinet/in.h>#include <afs/afs_args.h>#include <afs/cellconfig.h>#include <ctype.h>#include <afs/afssyscalls.h>#include <afs/afsutil.h>#include "AFS_component_version_number.c"intmain(int argc, char **argv){    afs_int32 code;    int i, counter;    afs_int32 parms[8];    int numberFlag;#ifdef AFS_LINUX20_ENV    long eparm[4];    struct afsprocdata syscall_data;    int fd;#endif /* AFS_LINUX20_ENV */#ifdef AFS_DARWIN80_ENV    struct afssysargs syscall_data;    void *ioctldata;    int fd, syscallnum;# ifdef AFS_DARWIN100_ENV    int is64 = 0;    struct afssysargs64 syscall64_data;# endif#endif    if (argc < 2) {	printf("use: vsys <call number> <parms>\n");	exit(1);    }    numberFlag = 1;    counter = 0;    for (i = 1; i < argc; i++) {	if (numberFlag && argv[i][0] == '-') {	    if (strcmp(argv[i], "-s") == 0)		numberFlag = 0;	    else {		printf("bad switch %s\n", argv[i]);		exit(1);	    }	} else if (numberFlag) {	    parms[counter++] = atoi(argv[i]);	    numberFlag = 1;	} else {	    parms[counter++] = (intptr_t)argv[i];	    numberFlag = 1;	}    }#ifdef AFS_LINUX20_ENV    fd = open(PROC_SYSCALL_FNAME, O_RDWR);    if (fd < 0)	fd = open(PROC_SYSCALL_ARLA_FNAME, O_RDWR);    eparm[0] = parms[3];    eparm[1] = parms[4];    eparm[2] = parms[5];    eparm[3] = parms[6];    syscall_data.syscall = AFSCALL_CALL;    syscall_data.param1 = parms[0];    syscall_data.param2 = parms[1];    syscall_data.param3 = parms[2];    syscall_data.param4 = (long) eparm;    printf("%s: calling syscall %d by whatever method\n",           __func__,           syscall_data.param1);    if (fd > 0) {	code = ioctl(fd, VIOC_SYSCALL, &syscall_data);	close(fd);    } /* else ... */#elif defined(AFS_DARWIN80_ENV)    fd = open(SYSCALL_DEV_FNAME,O_RDWR);# ifdef AFS_DARWIN100_ENV    if (sizeof(param1) == 8) {	syscallnum = VIOC_SYSCALL64;	is64 = 1;	ioctldata = &syscall64_data;	syscall64_data.syscall = (int)AFSCALL_CALL;	syscall64_data.param1 = parms[0];	syscall64_data.param2 = parms[1];	syscall64_data.param3 = parms[2];	syscall64_data.param4 = parms[3];	syscall64_data.param5 = parms[4];	syscall64_data.param6 = parms[5];    } else {# endif /* AFS_DARWIN100_ENV */	syscallnum = VIOC_SYSCALL;        ioctldata = &syscall_data;	syscall_data.syscall = AFSCALL_CALL;	syscall_data.param1 = parms[0];	syscall_data.param2 = parms[1];	syscall_data.param3 = parms[2];	syscall_data.param4 = parms[3];	syscall_data.param5 = parms[4];	syscall_data.param6 = parms[5];#ifdef AFS_DARWIN100_ENV    }#endif    if(fd >= 0) {        error = ioctl(fd, syscallnum, ioctldata);        close(fd);    } else {        error = -1;    }    if (!error) {#ifdef AFS_DARWIN100_ENV        if (is64)            error=syscall64_data.retval;        else#endif            error=syscall_data.retval;    }#else    code =	syscall(AFS_SYSCALL, parms[0], parms[1], parms[2], parms[3], parms[4],		parms[5]);#endif /* !AFS_LINUX20_ENV */    printf("code %d\n", code);    return 0;}