| www.delorie.com/archives/browse.cgi | search | 
| X-Authentication-Warning: | delorie.com: mail set sender to djgpp-bounces using -f | 
| From: | RayeR <glaux AT centrum DOT cz> | 
| Newsgroups: | comp.os.msdos.djgpp | 
| Subject: | Re: argv[0] | 
| Date: | Sun, 4 Dec 2011 14:22:28 -0800 (PST) | 
| Organization: | http://groups.google.com | 
| Lines: | 88 | 
| Message-ID: | <20af6883-aa05-4549-b820-ca0f7c80708d@ca1g2000vbb.googlegroups.com> | 
| References: | <16b04d29-8317-4c7f-929c-1a22a328fa32 AT p9g2000vbb DOT googlegroups DOT com> | 
| <jaueod$2t8$1 AT speranza DOT aioe DOT org> <9bf257a7-a0f8-43ba-a65f-36c6027f68cb AT r28g2000yqj DOT googlegroups DOT com> | |
| <jb1ejh$hm8$1 AT speranza DOT aioe DOT org> <cc43d375-8e59-425d-a32e-b4ca200ae5cc AT 4g2000yqu DOT googlegroups DOT com> | |
| <jbeegg$qp2$1 AT speranza DOT aioe DOT org> <dca06357-dc1d-4ede-aa9e-510e15e499b5 AT z17g2000vbe DOT googlegroups DOT com> | |
| <dca6ea34-7cf2-4abe-afc3-8a1122602ed9 AT y12g2000vba DOT googlegroups DOT com> | |
| <6719f201-2317-420d-bb38-3be66c90140b AT q9g2000yqe DOT googlegroups DOT com> <5059ad16-7787-49ef-8fb3-d9c21919a65b AT d10g2000vbf DOT googlegroups DOT com> | |
| NNTP-Posting-Host: | 78.45.168.98 | 
| Mime-Version: | 1.0 | 
| X-Trace: | posting.google.com 1323037468 17524 127.0.0.1 (4 Dec 2011 22:24:28 GMT) | 
| X-Complaints-To: | groups-abuse AT google DOT com | 
| NNTP-Posting-Date: | Sun, 4 Dec 2011 22:24:28 +0000 (UTC) | 
| Complaints-To: | groups-abuse AT google DOT com | 
| Injection-Info: | ca1g2000vbb.googlegroups.com; posting-host=78.45.168.98; posting-account=Q0wMHAoAAADjYrghh94FTf6YnbpTqZgp | 
| User-Agent: | G2/1.0 | 
| X-Google-Web-Client: | true | 
| X-Google-Header-Order: | HUALESNKRC | 
| X-HTTP-UserAgent: | Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.19) | 
| Gecko/20110420 SeaMonkey/2.0.14,gzip(gfe) | |
| Bytes: | 4380 | 
| To: | djgpp AT delorie DOT com | 
| DJ-Gateway: | from newsgroup comp.os.msdos.djgpp | 
| Reply-To: | djgpp AT delorie DOT com | 
Aha, I didn't imagine that it may go wrong when use tools like redir.
I personally didn't face the problem yet but it may be an issue.
Georg, I fully understand what do you need because I need it for the
same purpose. Here's my code I use of portable function but it rely on
argv[0] so now I know it's not 100% perfect :(
/
****************************************************************************/
/*                   How to get program execution
directory                 */
/
****************************************************************************/
/* Created: 21.2.2011 [DJGPP/MINGW32/
LINUX]                                 */
/* Last modified: 21.2.2011 [DJGPP/MINGW32/
LINUX]                           */
/* Copyright (C) 2011 by
RayeR                                          */
/
****************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#if defined __WIN32__
#include <windows.h>
#elif defined __linux__
#endif
int getexecdir(char *argv0, char *obuffer, int osize)
{
  char *last_backslash_in_path;
#ifdef __WIN32__
  GetModuleFileName(NULL, obuffer, osize); // get exec path
  obuffer[osize-1]=0;                  // trim to buffer size
#elif defined __linux__
  char path[1024];                     // auxiliary path
  struct stat stat_buf;
  strncpy(path, "/proc/self/exe", 1023); // exec path is in this file
  while (1)
    {
    size_t size=readlink(path, obuffer, osize-1);
    if (size==(size_t)~0)
      {
      obuffer[0]=0;
      break;
      }
    else
      {
      if (size>=osize)
        obuffer[osize-1]=0;
      else
        obuffer[size]=0;
      int i=stat(obuffer, &stat_buf);
      if (i==-1)
        break;
      else if (!S_ISLNK(stat_buf.st_mode))
        break;
      strncpy(obuffer, path, osize-1);
      obuffer[osize-1]=0;
      }
    }
#else
  strncpy(obuffer, argv0, osize);
  obuffer[osize-1]=0;
#endif
  last_backslash_in_path=strrchr(obuffer, '\\'); // find the last
backlash in the exec path
  if (last_backslash_in_path==NULL)    // if none
    last_backslash_in_path=strrchr(obuffer, '/'); // try to find
normal slash in the exec path
  if (last_backslash_in_path==NULL)
    {
    strcpy(obuffer, "./");             // use current directory
    return(-1);
    }
  else                                 // else copy exec path up to
last backslash (included)
    last_backslash_in_path[1]=0;       // cut off exec name from path
  return(0);
}
int main(int argc, char *argv[])
{
  char path[1024];
  getexecdir(argv[0], path, 1024);
  printf("execdir = %s\n", path);
  return(0);
}
| webmaster | delorie software privacy | 
| Copyright © 2019 by DJ Delorie | Updated Jul 2019 |