Пример #1
0
/*
 * Get the allocation info for a file. We pick some small number
 * of extents to get the residency info on at one time
 */
int
alloc_info(
	dm_sessid_t	 sid,
	void		*hanp,
	size_t		 hlen)
{
	int		i, more;
	dm_off_t	offset;
	u_int		nextents, nret;
	dm_extent_t	ext[NUM_EXTENTS];


	nextents = NUM_EXTENTS;
	offset   = 0;
	printf("\n\tAllocation info \n");
	do {
		more = dm_get_allocinfo(sid, hanp, hlen, DM_NO_TOKEN, &offset, 
					nextents, ext, &nret);
		if (more == -1) {
			errno_msg("Can't get alloc info for file");
			return(1);
		}
		for (i=0; i<nret; i++) {
			printf("\t\tExtent %d ", i);
			if (ext[i].ex_type == DM_EXTENT_RES)
				printf("(resident): ");
			if (ext[i].ex_type == DM_EXTENT_HOLE)
				printf("(hole): ");
			printf("offset %lld, ", (long long) ext[i].ex_offset);
			printf("len %llu\n", (unsigned long long) ext[i].ex_length);
		}
	} while (more == 1);
	return(0);
}
Пример #2
0
int
main(int argc, char **argv) {
     
        dm_sessid_t	sid = DM_NO_SESSION;
	dm_token_t	token[NUM_TOKENS];
	dm_token_t	test_token;
	void		*fs_hanp;
	size_t		fs_hlen;
	void		*dir_hanp;
	size_t		dir_hlen;
	void		*ap;
	size_t		alen;
	void		*bp;
	size_t		blen;
	void		*cp;
	size_t		clen;
	char		*name;
	char		*ls_path;
	char		*pathname;
	char            fname_a[100];
	char            fname_b[100];
	char            fname_c[100];
	char            command[150];
	int		opt;
	int             i=0;

	if (Progname = strrchr(argv[0], '/')) {
		Progname++;
	} else {
		Progname = argv[0];
	}

	opterr = 0;
	while ((opt = getopt(argc, argv, "vn:s:")) != EOF) {
		switch (opt) {
		case 'v':
		         Vflag++;
			 break;
		case 's': 
		         sid = atol(optarg);
			 break;
		case '?':
		         usage();
		}
	}
	if (optind + 2 != argc) {
		usage();
	}
	ls_path = argv[optind];
	pathname = argv[optind+1];

	if (dm_init_service(&name) == -1)  {
		fprintf(stderr, "Can't inititalize the DMAPI\n");
		exit(1);
	}
	if (sid == DM_NO_SESSION)
		find_test_session(&sid);
	
	printf("Beginning access rights testing...\n");

	sprintf(fname_a, "%s/DMAPI_rights_test_file_a", pathname);
	sprintf(command, "cp %s %s\n", ls_path, fname_a); 
	system(command);

	if (dm_path_to_handle(fname_a, &ap, &alen)) {
	  fprintf(stderr, "ERROR: can't get handle for %s; %s\n",
		  fname_a, ERR_NAME);
	  goto abort_test;
	}

	sprintf(fname_b, "%s/DMAPI_rights_test_file_b", pathname);
	sprintf(command, "cp %s %s\n", ls_path, fname_b); 
	system(command);
	
	if (dm_path_to_handle(fname_b, &bp, &blen)) {
	  fprintf(stderr, "ERROR: can't get handle for %s; %s\n",
		  fname_b, ERR_NAME);
	  goto abort_test;
	}

	sprintf(fname_c, "%s/DMAPI_rights_test_file_c", pathname);
	sprintf(command, "cp %s %s\n", ls_path, fname_c); 
	system(command);
	
	if (dm_path_to_handle(fname_c, &cp, &clen)) {
	  fprintf(stderr, "ERROR: can't get handle for %s; %s\n",
		  fname_c, ERR_NAME);
	  goto abort_test;
	}

	if (dm_path_to_fshandle(pathname, &fs_hanp, &fs_hlen)) {
	  fprintf(stderr, "ERROR: can't get handle for %s; %s\n",
		  pathname, ERR_NAME);
	  goto abort_test;
	}

	sprintf(pathname, "%s/DMAPI_rights_test_dir", pathname); 
	sprintf(command, "mkdir %s\n", pathname); 
	system(command);

	if (dm_path_to_handle(pathname, &dir_hanp, &dir_hlen)) {
	  fprintf(stderr, "ERROR: can't get handle for %s; %s\n",
		  pathname, ERR_NAME);
	  goto abort_test;
	}

	/* Test remaining functions for appropriate 
	 * right requirements...
	 *------------------------------------------------------------*/
	{ 
	  dm_off_t off = (dm_off_t)0;
	  dm_extent_t extent;
	  u_int nelem_ret;
	  SHAREDTEST("get_allocinfo", ap, alen, test_token,
		   dm_get_allocinfo(sid, ap, alen, test_token, 
				    &off, 1, &extent, &nelem_ret))
	}
	/*------------------------------------------------------------*/
	{ 
	  void *bufp=(void*)malloc(5*sizeof(dm_attrlist_t));
	  size_t rlen;
	  SHAREDTEST("getall_dmattr", ap, alen, test_token,
		   dm_getall_dmattr(sid, ap, alen, test_token, 
				    5, bufp, &rlen))
	}
	/*------------------------------------------------------------*/
	{ 
	  dm_attrloc_t loc;
	  SHAREDTEST("init_attrloc", dir_hanp, dir_hlen, test_token,
		     dm_init_attrloc(sid, dir_hanp, dir_hlen, test_token,
				     &loc))
	}
	/*------------------------------------------------------------*/
#if 0
	mkdir_by_handle is NOT SUPPORTED in current SGI DMAPI 

 	{ 
	  SHAREDTEST("mkdir_by_handle", fs_hanp, fs_hlen, test_token,
		     dm_mkdir_by_handle(sid, fs_hanp, fs_hlen, test_token,
					dir_hanp, dir_hlen, "FUBAR_DIR"))
	}
#endif
	/*------------------------------------------------------------*/
	{ dm_eventset_t eventset;
	  DMEV_ZERO(eventset);
	  EXCLTEST("set_disp", fs_hanp, fs_hlen, test_token,
		   dm_set_disp(sid, fs_hanp, fs_hlen, test_token,
			       &eventset, DM_EVENT_MAX))
	}
Пример #3
0
int
main(
	int	argc,
	char	**argv)
{
	dm_sessid_t	sid, oldsid, targetsid, *newsidp, *sidbufp;
	dm_token_t	token, *tokenp, *rtokenp, *tokenbufp;
	dm_attrname_t	*attrnamep;
	dm_off_t	off, *offp, *roffp;
	dm_extent_t	*extentp;
	dm_inherit_t	*inheritbufp;
	dm_stat_t	*statp;
	dm_size_t	len, *dmrlenp, *retvalp;
	dm_attrloc_t	*locp;
	dm_eventset_t	*eventsetp;
	dm_config_t	flagname;
	dm_region_t	*regbufp;
	dm_response_t	response;
	dm_right_t	right, *rightp;
	dm_igen_t	igen, *igenp;
	dm_msgtype_t	msgtype;
	dm_fileattr_t	*attrp;
	dm_boolean_t	enable, *exactflagp;
	dm_timestruct_t	*delay;
	mode_t		mode;
	size_t		hlen, dirhlen, hlen1, hlen2, targhlen, *fshlenp, *hlenp;
	size_t		msglen, buflen, *rlenp;
	u_int		nelem, mask, maxmsgs, uflags, *nelemp, maxevent;
	void		*hanp, *dirhanp, *hanp1, *hanp2, *targhanp;
	void		*msgdatap, *bufp, **hanpp, *respbufp, **fshanpp;
	dm_fsid_t	fsid, *fsidp;
	dm_ino_t	ino, *inop;
	char		*cname, *sessinfop, *path, *pathbufp, **versionstrpp;
	int		flags, fd, setdtime, reterror;
	u_int	urc;
	int	rc;
	dm_ssize_t	ssrc;

/* Definitions per the prototypes in dmport.h, in the same order. */

	rc = dm_clear_inherit(sid, hanp, hlen, token, attrnamep);
	rc = dm_create_by_handle(sid, dirhanp, dirhlen, token,
		hanp, hlen, cname);
	rc = dm_create_session(oldsid, sessinfop, newsidp);
	rc = dm_create_userevent(sid, msglen, msgdatap, tokenp);
	rc = dm_destroy_session(sid);
	rc = dm_downgrade_right(sid, hanp, hlen, token);
	rc = dm_fd_to_handle(fd, hanpp, hlenp);
	rc = dm_find_eventmsg(sid, token, buflen, bufp, rlenp);
	rc = dm_get_allocinfo(sid, hanp, hlen,
		token, offp, nelem, extentp, nelemp);
	rc = dm_get_bulkall(sid, hanp, hlen, token, mask, attrnamep,
		locp, buflen, bufp, rlenp);
	rc = dm_get_bulkattr(sid, hanp, hlen, token, mask, locp, buflen, 
		bufp, rlenp);
	rc = dm_get_config(hanp, hlen, flagname, retvalp);
	rc = dm_get_config_events(hanp, hlen, nelem, eventsetp, nelemp);
	rc = dm_get_dirattrs(sid, hanp, hlen, token, mask, locp, buflen,
		bufp, rlenp);
	rc = dm_get_dmattr(sid, hanp, hlen, token, attrnamep, buflen,
		bufp, rlenp);
	rc = dm_get_eventlist(sid, hanp, hlen, token, nelem, eventsetp, nelemp);
	rc = dm_get_events(sid, maxmsgs, flags, buflen, bufp, rlenp);
	rc = dm_get_fileattr(sid, hanp, hlen, token, mask, statp);
	rc = dm_get_mountinfo(sid, hanp, hlen, token, buflen, bufp, rlenp);
	rc = dm_get_region(sid, hanp, hlen, token, nelem, regbufp, nelemp);
	rc = dm_getall_disp(sid, buflen, bufp, rlenp);
	rc = dm_getall_dmattr(sid, hanp, hlen, token, buflen, bufp, rlenp);
	rc = dm_getall_inherit(sid, hanp, hlen,
		token, nelem, inheritbufp, nelemp);
	rc = dm_getall_sessions(nelem, sidbufp, nelemp);
	rc = dm_getall_tokens(sid, nelem, tokenbufp, nelemp);
	rc = dm_handle_cmp(hanp1, hlen1, hanp2, hlen2);
	dm_handle_free(hanp, hlen);
	urc = dm_handle_hash(hanp, hlen);
	rc = dm_handle_is_valid(hanp, hlen);
	rc = dm_handle_to_fshandle(hanp, hlen, fshanpp, fshlenp);
	rc = dm_handle_to_fsid(hanp, hlen, fsidp);
	rc = dm_handle_to_igen(hanp, hlen, igenp);
	rc = dm_handle_to_ino(hanp, hlen, inop);
	rc = dm_handle_to_path(dirhanp, dirhlen, targhanp, targhlen, 
		buflen, pathbufp, rlenp);
	rc = dm_init_attrloc(sid, hanp, hlen, token, locp);
	rc = dm_init_service(versionstrpp);
	rc = dm_make_handle(&fsid, &ino, &igen, hanpp, hlenp);
	rc = dm_make_fshandle(&fsid, hanpp, hlenp);
	rc = dm_mkdir_by_handle(sid, dirhanp, dirhlen, token,
		hanp, hlen, cname); 
	rc = dm_move_event(sid, token, targetsid, rtokenp);
	rc = dm_obj_ref_hold(sid, token, hanp, hlen);
	rc = dm_obj_ref_query(sid, token, hanp, hlen);
	rc = dm_obj_ref_rele(sid, token, hanp, hlen);
	rc = dm_path_to_fshandle(path, hanpp, hlenp);
	rc = dm_path_to_handle(path, hanpp, hlenp);
	rc = dm_pending(sid, token, delay);
	rc = dm_probe_hole(sid, hanp, hlen, token, off, len, roffp, dmrlenp);
	rc = dm_punch_hole(sid, hanp, hlen, token, off, len);
	rc = dm_query_right(sid, hanp, hlen, token, rightp);
	rc = dm_query_session(sid, buflen, bufp, rlenp);
	ssrc = dm_read_invis(sid, hanp, hlen, token, off, len, bufp);
	rc =  dm_release_right(sid, hanp, hlen, token);
	rc = dm_remove_dmattr(sid, hanp, hlen, token, setdtime, attrnamep);
	rc = dm_request_right(sid, hanp, hlen, token, uflags, right);
	rc = dm_respond_event(sid, token, response, reterror, buflen, respbufp);
	rc = dm_send_msg(sid, msgtype, buflen, bufp);
	rc = dm_set_disp(sid, hanp, hlen, token, eventsetp, maxevent);
	rc = dm_set_dmattr(sid, hanp, hlen,
		token, attrnamep, setdtime, buflen, bufp);
	rc = dm_set_eventlist(sid, hanp, hlen, token, eventsetp, maxevent);
	rc = dm_set_fileattr(sid, hanp, hlen, token, mask, attrp);
	rc = dm_set_inherit(sid, hanp, hlen, token, attrnamep, mode);
	rc = dm_set_region(sid, hanp, hlen, token, nelem, regbufp, exactflagp);
	rc = dm_set_return_on_destroy(sid, hanp, hlen,
		token,  attrnamep, enable);
	rc = dm_symlink_by_handle(sid, dirhanp, dirhlen, token,
		hanp, hlen, cname, path); 
	rc = dm_sync_by_handle(sid, hanp, hlen, token);
	rc = dm_upgrade_right(sid, hanp, hlen, token);
	ssrc = dm_write_invis(sid, hanp, hlen, flags, token, off, len, bufp);
	exit(0);
}
Пример #4
0
static int
print_alloc(
	dm_sessid_t	sid,
	void		*hanp,
	size_t		hlen,
	char		*pathname,
	dm_off_t	startoff,
	u_int		nelem)
{
	dm_off_t	endoff;
	dm_extent_t	*extent;
	u_int		nelemp;
	u_int		num = 0;
	u_int		i;
	char		*type = NULL;
	int		rc;
	
	if (Dflag) fprintf(stdout, "%s: starting offset %lld\n", pathname, startoff);

	/* Allocate space for the number of extents requested by the user. */

	if ((extent = malloc(nelem * sizeof(*extent))) == NULL) {
		fprintf(stderr, "can't malloc extent structures\n");
		return(1);
	}

	rc = 1;
	endoff = startoff;

	while (rc != 0) {
	  rc = dm_get_allocinfo(sid, hanp, hlen, DM_NO_TOKEN, &startoff,
				nelem, extent, &nelemp);
	  if (rc < 0) {
	    fprintf(stderr, "dm_get_allocinfo failed, %s\n",
		    strerror(errno));
	    return(1);
	  }
	  
	  if (Dflag) fprintf(stdout, "\treturned %d, nelemp %d\n", rc, nelemp);
	  
	  if (Dflag && nelemp)
	    fprintf(stdout, " ex_type    ex_offset       ex_length\n");
		
	  /* Note: it is possible for nelemp to be zero! */
	  
	  for (i = 0; i < nelemp; i++) {
	    /* The extent must either be reserved space or a hole. */
	    switch (extent[i].ex_type) {
	    case DM_EXTENT_RES:
	      type = "resv";
	      break;
	    case DM_EXTENT_HOLE:
	      type = "hole";
	      break;
	    default:
	      fprintf(stderr, "invalid extent type %d\n",
		      extent[i].ex_type);
	      return(1);
	    }
	    
	    if (i!=nelemp-1 || rc!=0) {
	      if (!Dflag) {
		fprintf(stdout, "\t%d: [%lld..%lld]: %s", num,
			extent[i].ex_offset / 512,
			(extent[i].ex_offset +
			 extent[i].ex_length - 1) / 512, type);
		if ((extent[i].ex_offset % 512 != 0) ||
				    (endoff % 512 != 0)) {
		  fprintf(stdout, "\t[%lld..%lld]\n",
			  extent[i].ex_offset % 512,
			  (endoff-1) % 512);
		} else {
		  fprintf(stdout, "\n");
		}
	      } else {
		fprintf(stdout, "%5s	%13lld	%13lld\n",
			type, extent[i].ex_offset,
			extent[i].ex_length);
	      }
	    }
	    /* The ex_offset of the first extent should match the
	       'startoff' specified by the caller.  The ex_offset
	       in subsequent extents should always match
	       (ex_offset + ex_length) of the previous extent,
	       and should always start on a 512 byte boundary.
	       */
	    
	    if (extent[i].ex_offset != endoff) {
	      fprintf(stderr, "new extent (%lld)is not "
		      "adjacent to previous one (%lld)\n",
		      extent[i].ex_offset, endoff);
	      return(1);
	    }
	    if (num && (extent[i].ex_offset % 512) != 0) {
	      fprintf(stderr, "non-initial ex_offset (%lld) "
		      "is not a 512-byte multiple\n",
		      extent[i].ex_offset);
	      return(1);
	    }
	    
	    /* Non-initial extents should have ex_length values
	       that are an even multiple of 512.  The initial
	       extent should be a multiple of 512 less the offset
	       into the starting 512-byte block.
	       */
	    
	    if (((extent[i].ex_offset % 512) + extent[i].ex_length) % 512 != 0) { 
	      fprintf(stderr, "ex_length is incorrect based "
		      "upon the ex_offset\n");
	      return(1);
	    }
	    
	    endoff = extent[i].ex_offset + extent[i].ex_length;
	    num++;		/* count of extents printed */
	  }
	  
	  /* If not yet at end of file, the startoff parameter should
	     match the ex_offset plus ex_length of the last extent
	     retrieved.
	     */
	  
	  if (rc && startoff != endoff) {
	    fprintf(stderr, "startoff is %lld, should be %lld\n",
		    startoff, endoff);
	    return(1);
	  }
	  
	  /* If we are at end of file, the last extent should be a
	     hole.
	     */
	  
	  if (!rc && type && strcmp(type, "hole")) {
	    fprintf(stderr, "file didn't end with a hole\n");
	    return(1);
	  }
	}

	/* At end of file, startoff should always equal zero. */
	
	if (startoff != 0) {
	  fprintf(stderr, "startoff was not zero at end of file\n");
	  return(1);
	}
	return(0);
}