~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to mysys/my_symlink2.cc

  • Committer: devananda
  • Date: 2009-06-30 14:27:54 UTC
  • mfrom: (1030.2.4 trunk)
  • mto: (1093.1.7 captain)
  • mto: This revision was merged to the branch mainline in revision 1095.
  • Revision ID: devananda.vdv@gmail.com-20090630142754-vm9w374yxkf1pikc
mergeĀ fromĀ lp

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
  /* Test if we should create a link */
33
33
  int create_link;
34
34
  char abs_linkname[FN_REFLEN];
 
35
  char rp_buff[PATH_MAX];
35
36
 
36
37
  if (my_disable_symlinks)
37
38
  {
43
44
  else
44
45
  {
45
46
    if (linkname)
46
 
      my_realpath(abs_linkname, linkname, MYF(0));
 
47
    {
 
48
      if (!realpath(linkname,rp_buff))
 
49
        my_load_path(rp_buff, linkname, NULL);
 
50
      rp_buff[FN_REFLEN-1]= '\0';
 
51
      strcpy(abs_linkname,rp_buff);
 
52
    }
47
53
    create_link= (linkname && strcmp(abs_linkname,filename));
48
54
  }
49
55
 
71
77
      if (MyFlags & MY_DELETE_OLD)
72
78
        my_delete(linkname, MYF(0));
73
79
      /* Create link */
74
 
      if (my_symlink(filename, linkname, MyFlags))
 
80
      if (symlink(filename,linkname))
75
81
      {
76
82
        /* Fail, remove everything we have done */
77
83
        tmp_errno=my_errno;
80
86
        file= -1;
81
87
        my_errno=tmp_errno;
82
88
      }
 
89
      else if (MyFlags & MY_SYNC_DIR)
 
90
        my_sync_dir_by_file(linkname, MyFlags);
83
91
    }
84
92
  }
85
93
  return(file);
93
101
int my_delete_with_symlink(const char *name, myf MyFlags)
94
102
{
95
103
  char link_name[FN_REFLEN];
96
 
  int was_symlink= (!my_disable_symlinks &&
97
 
                    !my_readlink(link_name, name, MYF(0)));
 
104
  ssize_t sym_link_size= readlink(name,link_name,FN_REFLEN-1);
 
105
  int was_symlink= (!my_disable_symlinks && sym_link_size != -1);
98
106
  int result;
99
107
 
100
108
  if (!(result=my_delete(name, MyFlags)))
101
109
  {
102
110
    if (was_symlink)
103
 
      result=my_delete(link_name, MyFlags);
 
111
    {
 
112
      link_name[sym_link_size]= '\0';
 
113
      result= my_delete(link_name, MyFlags);
 
114
    }
104
115
  }
105
116
  return(result);
106
117
}
121
132
  return my_rename(from, to, MyFlags);
122
133
#else
123
134
  char link_name[FN_REFLEN], tmp_name[FN_REFLEN];
 
135
  int sym_link_size= -1;
124
136
  int was_symlink= (!my_disable_symlinks &&
125
 
                    !my_readlink(link_name, from, MYF(0)));
 
137
                   (sym_link_size= readlink(from,link_name,FN_REFLEN-1)) != -1);
126
138
  int result=0;
127
139
  int name_is_different;
128
140
 
129
141
  if (!was_symlink)
130
142
    return(my_rename(from, to, MyFlags));
 
143
  else
 
144
    link_name[sym_link_size]= '\0';
131
145
 
132
146
  /* Change filename that symlink pointed to */
133
147
  strcpy(tmp_name, to);
142
156
  }
143
157
 
144
158
  /* Create new symlink */
145
 
  if (my_symlink(tmp_name, to, MyFlags))
 
159
  if (symlink(tmp_name, to))
146
160
    return(1);
 
161
  else if (MyFlags & MY_SYNC_DIR)
 
162
    my_sync_dir_by_file(to, MyFlags);
147
163
 
148
164
  /*
149
165
    Rename symlinked file if the base name didn't change.