Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 18 Nov 1999 15:47:36 -0500
From:      Greg Lehey <grog@mojave.sitaranetworks.com>
To:        rover@lglobus.ru, freebsd-questions@FreeBSD.ORG
Subject:   Re: Is there correct way for program to read from itself?
Message-ID:  <19991118154736.22915@mojave.sitaranetworks.com>
In-Reply-To: <19991118232846.A63288@fly.lglobus.ru>; from Oleg V. Volkov on Thu, Nov 18, 1999 at 11:28:46PM %2B0300
References:  <19991118065815.B89755@fly.lglobus.ru> <19991118102421.09370@mojave.sitaranetworks.com> <19991118223426.A62913@fly.lglobus.ru> <19991118152324.37840@mojave.sitaranetworks.com> <19991118232846.A63288@fly.lglobus.ru>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thursday, 18 November 1999 at 23:28:46 +0300, Oleg V. Volkov wrote:
> On Thu, Nov 18, 1999 at 03:23:24PM -0500, Greg Lehey wrote:
>>>>> Is there correct way for porgram to read from it's own file?
>>>> I'm not sure I understand.  What do you mean by "it's own file"?
>>>> If you mean the object file, sure.  Where's the problem?
>>> I mean this situation:
>>> I have some program /usr/local/bin/someprog. Is there a way for it
>>> to read from itself (from /usr/local/bin/someprog).
>> Sure, that's what I said.  What do you expect to find?
>
> Could you give me short example?

OK, here's copyme.c:

#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>

extern int errno;

main (int argc, char *argv [])
{
  int me = open (argv [0], O_RDONLY);
  int you;
  char buffer [4096];
  int count;

  if (argc < 2)
    {
    fprintf (stderr, "No output file specified\n");
    return 1;
    }
  if (me < 0)
    {
    fprintf (stderr, "Can't open %s: %s\n", argv [0], strerror (errno));
    return 1;
    }
  you = open (argv [1], O_RDWR | O_APPEND | O_CREAT, S_IRUSR);
  if (you < 0)
    {
    fprintf (stderr, "Can't open %s: %s\n", argv [1], strerror (errno));
    return 1;
    }
  while ((count = read (me, buffer, 4096)) > 0)
    {
    if (write (you, buffer, count) < 0)
      {
      perror ("Can't write");
      return 1;
      }
    }
  if (count < 0)
    {
    perror ("Can't read");
    return 1;
    }
  return ;
  }

And here's what happens when I run it:

 $ copyme foo
 $ cmp copyme foo 
 $ ls -l copyme foo 
 -rwxrwxrwx  1 grog  eng  4197 Nov 18 15:44 copyme
 -r--------  1 grog  eng  4197 Nov 18 15:44 foo
 $ 

Not much use, is it?  Was that your class assignment?

Greg
--
When replying to this message, please copy the original recipients.
For more information, see http://www.lemis.com/questions.html
Finger grog@lemis.com for PGP public key
See complete headers for address and phone numbers


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19991118154736.22915>