• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 258
  • Last Modified:

using lseek( )

how can i use a for loop to traverse bit_map[i] array and finds the next available free bitmap position using lseek( )?
Note: i use man lseek page but the concept is still not very clear to me can an expert help out?
0
achille67
Asked:
achille67
1 Solution
 
jlevieCommented:
lseek() is only used to position the read/write pointer to a file at a speciffied offset. It doesn't operate on arrays.
0
 
achille67Author Commented:
Oh ok, so how do i use position a read/write pointer?
0
 
Karl Heinz KremerCommented:
You first need to open a file, then you call lseek to position the read/write pointer (which one it is depends on wether you've opened the file in read or write mode):


    int fd;

    fd = open("/path/to/file", O_RDONLY);
    lseek(fd, 1000, SEEK_SET);

This sets the read pointer to the position 1000 in the file. You can find out more about these calls in th eman pages:

man 2 lseek
man 2 open


... but, this has very likely nothing to do with your problem ... What exactly are you trying to accomplish? Do you already have code for your bit_map array? If so, please show it to illustrate your problem.

0
 
achille67Author Commented:
Thanks khkremer,

The following code is simply importing linux_file from my linux file system to
to u_file residing in my own file system i just create by running the command:
./userfs -reformat 800000 file.system
At some point of the implementation of of u_import, i want to find
next free available free bitmap in bit_map[i] array  and position lseek to that place with  lseek(virtual_disk,BLOCK_SIZE_BYTES,SEEK_SET);
NOTE: u_import is a function of an entire file system homework(you may take a look at it at:  http://www.clarkson.edu/~jnm/os/homework/userfs/fs.htm)

int u_import(char* linux_file, char* u_file)
{
        int free_space;
        int num_block;
        struct stat st;
        int file_size=0;
        int remainder=0;
        int i;
        int j;

        free_space = u_quota();

        handle = open(linux_file,O_RDONLY);
        if ( -1 == handle ) {
                printf("error, reading file %s\n",linux_file);
                return 0;
        }

        fstat(handle,&st);
        file_size=(int)st.st_size;
        num_block=(int)file_size/BLOCK_SIZE_BYTES;
        if((num_block*BLOCK_SIZE_BYTES)!=file_size)
          {
            num_block++;
            remainder=file_size-(num_block*BLOCK_SIZE_BYTES);
          }
     for(i=0;i<num_block;i++)
          {
            lseek(handle,BLOCK_SIZE_BYTES*i,SEEK_SET);
             read(handle,&buffer,BLOCK_SIZE_BYTES);


             //      crash_write(virtual_disk, bit_map, sizeof(BIT)*BIT_MAP_SIZE );

             // bit_map[i] array and finds the next available free bitmap
             //position lseek to that place with
                     for (j=0; j< BIT_MAP_SIZE; j++){
             assert( free_space >= 1);
               allocate_block(i);

                 lseek(virtual_disk,BLOCK_SIZE_BYTES,SEEK_SET);

                     }
                     .
                     .
                     .
                      return 1;
}
0
 
stefan73Commented:
Hi achille67,
I see that you use int for calculating offsets. That will very likely cause problems, as offsets should be 64 bits. Define an unsigned type which you use for FS block/seek oprations, like

typedef uint32_t fs_block_t; /* For storing block numbers */
typedef uint64_t fs_seek_t;  /* For seeking in files      */

The system offers the off_t type for seeks which you can also use.

Cheers,
Stefan
0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now