~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/internal/my_symlink2.cc

  • Committer: Mark Atwood
  • Date: 2011-08-01 05:22:14 UTC
  • mfrom: (1919.3.53 drizzle_pbms)
  • Revision ID: me@mark.atwood.name-20110801052214-3wdsx3xgld6b5v4f
mergeĀ lp:~barry-leslie/drizzle/drizzle_pbms

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
#include <drizzled/error.h>
27
27
#include <drizzled/internal/m_string.h>
28
28
 
29
 
namespace drizzled {
30
 
namespace internal {
 
29
namespace drizzled
 
30
{
 
31
namespace internal
 
32
{
31
33
 
32
34
int my_create_with_symlink(const char *linkname, const char *filename,
33
35
                           int createflags, int access_flags, myf MyFlags)
34
36
{
 
37
  int file;
 
38
  int tmp_errno;
35
39
  /* Test if we should create a link */
36
 
  bool create_link= false;
 
40
  int create_link;
 
41
  char abs_linkname[FN_REFLEN];
37
42
  char rp_buff[PATH_MAX];
38
43
 
39
44
  if (my_disable_symlinks)
40
45
  {
41
46
    /* Create only the file, not the link and file */
 
47
    create_link= 0;
42
48
    if (linkname)
43
49
      filename= linkname;
44
50
  }
45
 
  else if (linkname)
 
51
  else
46
52
  {
47
 
    if (!realpath(linkname,rp_buff))
48
 
      my_load_path(rp_buff, linkname, NULL);
49
 
    rp_buff[FN_REFLEN-1]= '\0';
50
 
    char abs_linkname[FN_REFLEN];
51
 
    strcpy(abs_linkname, rp_buff);
52
 
    create_link= strcmp(abs_linkname, filename);
 
53
    if (linkname)
 
54
    {
 
55
      if (!realpath(linkname,rp_buff))
 
56
        my_load_path(rp_buff, linkname, NULL);
 
57
      rp_buff[FN_REFLEN-1]= '\0';
 
58
      strcpy(abs_linkname,rp_buff);
 
59
    }
 
60
    create_link= (linkname && strcmp(abs_linkname,filename));
53
61
  }
54
62
 
55
63
  if (!(MyFlags & MY_DELETE_OLD))
68
76
    }
69
77
  }
70
78
 
71
 
  int file= my_create(filename, createflags, access_flags, MyFlags);
72
 
  if (file >= 0 && create_link)
 
79
  if ((file=my_create(filename, createflags, access_flags, MyFlags)) >= 0)
73
80
  {
74
 
    /* Delete old link/file */
75
 
    if (MyFlags & MY_DELETE_OLD)
76
 
      my_delete(linkname, MYF(0));
77
 
    /* Create link */
78
 
    if (symlink(filename,linkname))
 
81
    if (create_link)
79
82
    {
80
 
      /* Fail, remove everything we have done */
81
 
      int tmp_errno= errno;
82
 
      my_close(file, MYF(0));
83
 
      my_delete(filename, MYF(0));
84
 
      file= -1;
85
 
      errno= tmp_errno;
 
83
      /* Delete old link/file */
 
84
      if (MyFlags & MY_DELETE_OLD)
 
85
        my_delete(linkname, MYF(0));
 
86
      /* Create link */
 
87
      if (symlink(filename,linkname))
 
88
      {
 
89
        /* Fail, remove everything we have done */
 
90
        tmp_errno=errno;
 
91
        my_close(file,MYF(0));
 
92
        my_delete(filename, MYF(0));
 
93
        file= -1;
 
94
        errno=tmp_errno;
 
95
      }
 
96
      else if (MyFlags & MY_SYNC_DIR)
 
97
        my_sync_dir_by_file(linkname, MyFlags);
86
98
    }
87
 
    else if (MyFlags & MY_SYNC_DIR)
88
 
      my_sync_dir_by_file(linkname, MyFlags);
89
99
  }
90
 
  return file;
 
100
  return(file);
91
101
}
92
102
 
93
103
/*