home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / mysys / my_getwd.c < prev    next >
C/C++ Source or Header  |  2000-08-31  |  5KB  |  183 lines

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17.  
  18. /* my_setwd() and my_getwd() works with intern_filenames !! */
  19.  
  20. #include "mysys_priv.h"
  21. #include <m_string.h>
  22. #include "mysys_err.h"
  23. #ifdef HAVE_GETWD
  24. #include <sys/param.h>
  25. #endif
  26. #if defined(MSDOS) || defined(__WIN__)
  27. #include <m_ctype.h>
  28. #include <dos.h>
  29. #include <direct.h>
  30. #endif
  31.  
  32.  
  33.     /* Gets current working directory in buff. Directory is allways ended
  34.        with FN_LIBCHAR */
  35.     /* One must pass a buffer to my_getwd. One can allways use
  36.        curr_dir[] */
  37.  
  38. int my_getwd(my_string buf, uint size, myf MyFlags)
  39. {
  40.   my_string pos;
  41.   DBUG_ENTER("my_getwd");
  42.   DBUG_PRINT("my",("buf: %lx  size: %d  MyFlags %d", buf,size,MyFlags));
  43.  
  44. #if ! defined(MSDOS)
  45.   if (curr_dir[0])                /* Current pos is saved here */
  46.     VOID(strmake(buf,&curr_dir[0],size-1));
  47.   else
  48. #endif
  49.   {
  50. #if defined(HAVE_GETCWD)
  51.     if (!getcwd(buf,size-2) && MyFlags & MY_WME)
  52.     {
  53.       my_errno=errno;
  54.       my_error(EE_GETWD,MYF(ME_BELL+ME_WAITTANG),errno);
  55.       return(-1);
  56.     }
  57. #elif defined(HAVE_GETWD)
  58.     {
  59.       char pathname[MAXPATHLEN];
  60.       getwd(pathname);
  61.       strmake(buf,pathname,size-1);
  62.     }
  63. #elif defined(VMS)
  64.     if (!getcwd(buf,size-2,1) && MyFlags & MY_WME)
  65.     {
  66.       my_errno=errno;
  67.       my_error(EE_GETWD,MYF(ME_BELL+ME_WAITTANG),errno);
  68.       return(-1);
  69.     }
  70.     intern_filename(buf,buf);
  71. #else
  72. #error "No way to get current directory"
  73. #endif
  74.     if (*((pos=strend(buf))-1) != FN_LIBCHAR)  /* End with FN_LIBCHAR */
  75.     {
  76.       pos[0]= FN_LIBCHAR;
  77.       pos[1]=0;
  78.     }
  79.     (void) strmake(&curr_dir[0],buf,(size_s) (FN_REFLEN-1));
  80.   }
  81.   DBUG_RETURN(0);
  82. } /* my_getwd */
  83.  
  84.  
  85.     /* Set new working directory */
  86.  
  87. int my_setwd(const char *dir, myf MyFlags)
  88. {
  89.   int res;
  90.   size_s length;
  91.   my_string start,pos;
  92. #if defined(VMS) || defined(MSDOS)
  93.   char buff[FN_REFLEN];
  94. #endif
  95.   DBUG_ENTER("my_setwd");
  96.   DBUG_PRINT("my",("dir: '%s'  MyFlags %d", dir, MyFlags));
  97.  
  98.   start=(my_string) dir;
  99. #if defined(MSDOS)        /* MSDOS chdir can't change drive */
  100. #if !defined(_DDL) && !defined(WIN32)
  101.   if ((pos=strchr(dir,FN_DEVCHAR)) != 0)
  102.   {
  103.     uint drive,drives;
  104.  
  105.     pos++;                /* Skipp FN_DEVCHAR */
  106.     drive=(uint) (toupper(dir[0])-'A'+1); drives= (uint) -1;
  107.     if ((pos-(byte*) dir) == 2 && drive > 0 && drive < 32)
  108.     {
  109.       _dos_setdrive(drive,&drives);
  110.       _dos_getdrive(&drives);
  111.     }
  112.     if (drive != drives)
  113.     {
  114.       *pos='\0';            /* Dir is now only drive */
  115.       my_errno=errno;
  116.       my_error(EE_SETWD,MYF(ME_BELL+ME_WAITTANG),dir,ENOENT);
  117.       DBUG_RETURN(-1);
  118.     }
  119.     dir=pos;                /* drive changed, change now path */
  120.   }
  121. #endif
  122.   if (*((pos=strend(dir)-1)) == FN_LIBCHAR && pos != dir)
  123.   {
  124.     strmov(buff,dir)[-1]=0;            /* Remove last '/' */
  125.     dir=buff;
  126.   }
  127. #endif /* MSDOS*/
  128.   if (! dir[0] || (dir[0] == FN_LIBCHAR && dir[1] == 0))
  129.     dir=FN_ROOTDIR;
  130. #ifdef VMS
  131.   {
  132.     pos=strmov(buff,dir);
  133.     if (pos[-1] != FN_LIBCHAR)
  134.     {
  135.       pos[0]=FN_LIBCHAR;        /* Mark as directory */
  136.       pos[1]=0;
  137.     }
  138.     system_filename(buff,buff);        /* Change to VMS format */
  139.     dir=buff;
  140.   }
  141. #endif /* VMS */
  142.   if ((res=chdir((char*) dir)) != 0)
  143.   {
  144.     my_errno=errno;
  145.     if (MyFlags & MY_WME)
  146.       my_error(EE_SETWD,MYF(ME_BELL+ME_WAITTANG),start,errno);
  147.   }
  148.   else
  149.   {
  150.     if (test_if_hard_path(start))
  151.     {                        /* Hard pathname */
  152.       pos=strmake(&curr_dir[0],start,(size_s) FN_REFLEN-1);
  153.       if (pos[-1] != FN_LIBCHAR)
  154.       {
  155.     length=(uint) (pos-(char*) curr_dir);
  156.     curr_dir[length]=FN_LIBCHAR;        /* must end with '/' */
  157.     curr_dir[length+1]='\0';
  158.       }
  159.     }
  160.     else
  161.       curr_dir[0]='\0';                /* Don't save name */
  162.   }
  163.   DBUG_RETURN(res);
  164. } /* my_setwd */
  165.  
  166.  
  167.  
  168.     /* Test if hard pathname */
  169.     /* Returns 1 if dirname is a hard path */
  170.  
  171. int test_if_hard_path(register const char *dir_name)
  172. {
  173.   if (dir_name[0] == FN_HOMELIB && dir_name[1] == FN_LIBCHAR)
  174.     return (home_dir != NullS && test_if_hard_path(home_dir));
  175.   if (dir_name[0] == FN_LIBCHAR)
  176.     return (TRUE);
  177. #ifdef FN_DEVCHAR
  178.   return (strchr(dir_name,FN_DEVCHAR) != 0);
  179. #else
  180.   return FALSE;
  181. #endif
  182. } /* test_if_hard_path */
  183.