How do you find the symbolic links to files.
    Jon Brawn 
    jonb at specialix.co.uk
       
    Thu Dec  6 05:32:23 AEST 1990
    
    
  
brnstnd at kramden.acf.nyu.edu (Dan Bernstein) writes:
>In article <1990Dec5.052124.28435 at erg.sri.com> zwicky at erg.sri.com (Elizabeth Zwicky) writes:
>> Unfortunately, you
>> have to get pretty intimate with the disk to tell that the 20 meg of
>> nulls aren't there
>Hardly. You just look at the file size. Other than the file size, there
>is no way a portable program can tell the difference between a hole and
>an allocated block of zeros. If an archiver knows the block size and
>sees that a file has N holes, it can just squish the first N holes it
>finds, and write explicit zeros in the remaining zero-filled blocks.
Umm? really? I wrote this program:
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
/*
** This program was written on SCO Unix System V release 3.2.something.
*/
char	buffer[1024];
main()
{
	int fd;			/* file desctiptor */
	int block;		/* a block number  */
	long offset;		/* offset at which to write above block */
	struct stat statb;	/* stat structure used to read the file size */
	/*
	** set the buffer to a known data pattern:
	*/
	memset(buffer,42,sizeof(buffer));
	/*
	** create a new file
	*/
	if ( (fd = creat("hole_file",0666))==-1 )
	{
		perror("cant creat hole_file");
		exit(1);
	}
	/*
	** write ten (sparse) blocks to it
	*/
	for ( block=0; block<10; block++ )
	{
		/*
		** blocks are at 10K intervals in the file
		*/
		offset = block * 10240;
		/*
		** seek...
		*/
		if ( lseek(fd,offset,0) != offset )
		{
			perror("cant seek into hole_file");
			exit(1);
		}
		/*
		** ...write
		*/
		if ( write(fd,buffer,sizeof(buffer)) != sizeof(buffer) )
		{
			perror("cant write hole_file");
			exit(1);
		}
	}
	/*
	** close the file
	*/
	if ( close(fd) == -1 )
	{
		perror("trouble closeing hole_file");
	}
	/*
	** ask the OS how big the file is
	*/
	if ( stat("hole_file",&statb)==-1 )
	{
		perror("cant stat hole_file");
		exit(1);
	}
	printf("stat information for hole_file:\n");
	printf("st_size %d\n",statb.st_size);
	system("ls -ils hole_file");
}
And ran it, producing this output:
stat information for hole_file:
st_size 93184
16314  184 -rw-rw----   1 jonb     soft       93184 Dec  5 18:23 hole_file
inode size  mode      num user     group       size date   time  name
    (blocks)        links name     name      (bytes)
The size of the file is indeed 9*10240+1024.
Now, please demonstrate to your audience where the holes can be detected?
>---Dan
Jonb
--
``Let the myth be expelled. I stand here before you. Can you not see me?
  Do you not hear my voice?''
    
    
More information about the Comp.unix.internals
mailing list