[X-Unix] Unlinking a file... illegal characters?

Stroller MacMonster at myrealbox.com
Sat Feb 26 18:40:02 PST 2005


On Feb 26, 2005, at 11:25 pm, Stroller wrote:
> C was the language I thought to do this in. Thanks for this code - I 
> didn't get past the thinking-about-it stage because I've never done 
> any file handling in C before (in my defence, I did complete a 
> compiler project with C in uni).
>
>   $ ./godir
>   .                              1041563
>   ..                             224420
>   godir                          1041568
>   godir.c                        1041561
>   $ ./godir /Volumes/CLEARLIGHT/foo/legoland
>   .                              731381
>   ..                             772975
>   eÌ•yÌ√yÌ√yÌ√vkâ∆•â∆•..â∆•â∆•   169384
>
> ...With the benefit of Mr Tilliard's code, I'm gonna have a crack at 
> writing something to unlink $1.

Bah! I spent ages (IE: the last 3 hours) at this - far too long making 
it pretty & doing error checking & stuff.
See the attached. Still no joy.  Grrrr!

   $ ls /Volumes/CLEARLIGHT/foo/legoland
   e??y??y??y??vk??????..??????
   $ ./godir !!:$
   ./godir /Volumes/CLEARLIGHT/foo/legoland
   .                              731381
   ..                             772975
   èÿÿÿvk␀␀..␀␀   169384
   $ ./delinode 169384
   Usage: ./delinode <inode number> <containing directory>
   $ ./delinode 169384 !-2:$
   ./delinode 169384 /Volumes/CLEARLIGHT/foo/legoland
   Looking for inode 169384 in directory /Volumes/CLEARLIGHT/foo/legoland
   èÿÿÿvk␀␀..␀␀ is the name of the file referred to by 
inode 169384Failed to remove it     :(
   $ ls /Volumes/CLEARLIGHT/foo/legoland
   e??y??y??y??vk??????..??????
   $ ./delinode 169384 /Volumes/CLEARLIGHT/foo/legoland
   Looking for inode 169384 in directory /Volumes/CLEARLIGHT/foo/legoland
   èÿÿÿvk␀␀..␀␀ is the name of the file referred to by 
inode 169384Failed to remove it     :(
   $

Any suggestions, anyone? if this wasn't a Useful Academic Exercise (tm) 
I'd just back-up my data & format the damn thing.

Stroller.


-------------- next part --------------
#include <stdio.h>
#include <dirent.h>


static int
usage (char *myname)
{
  // TODO: See K&R 7.6 re STDERR
  printf ("Usage: %s <inode number> <containing directory>\n", myname);
}

static int
doDirectory (char *name, int inode)
{
  struct dirent *dir;
  DIR *dirp;

  int return_value = 1;

  // Check to see if directory exists 
  if ((dirp = opendir (name)) == (DIR *) 0L)
    {
      perror (name);
      return (-1);
    }

  // Navigate thro' directory looking for inode prey
  while (dir = readdir (dirp))
    {
      if (dir->d_ino == inode)
	{
	  printf ("%s is the name of the file referred to by inode %d\n",
		  dir->d_name, inode);
	  return_value = (remove (dir->d_name));
	}
    }

  closedir (dirp);
  return (return_value);
}


int
main (int argc, char **argv)
{
  int inode;

  if ((argc != 3) || !(inode = atoi (argv[1])))
    {
      usage (argv[0]);
      return (1);
    }

  printf ("Looking for inode %d in directory %s\n", inode, argv[2]);

  if (doDirectory (argv[2], inode))
    {
      printf ("Failed to remove it	:(\n");
      return 1;
    }
  else
    printf ("Inode removed sucessfully   :D\n");


  return (0);
}


More information about the X-Unix mailing list