[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    kdeadmin/kuser
From:       Szombathelyi György <gyurco () freemail ! hu>
Date:       2004-08-24 19:47:16
Message-ID: 20040824194716.F2BAD1773 () office ! kde ! org
[Download RAW message or body]

CVS commit by gyurco: 

Handle symlinks in /etc/skel correctly. CCMAIL:87887-done@bugs.kde.org


  M +49 -44    kuser.cpp   1.75


--- kdeadmin/kuser/kuser.cpp  #1.74:1.75
@@ -612,15 +612,13 @@ int KUser::createMailBox()
 void KUser::copyDir(const QString &srcPath, const QString &dstPath)
 {
-  struct stat st;
+  mode_t mode;
   QDir s(srcPath);
   QDir d(dstPath);
-  QString prefix = QFile::decodeName(SKEL_FILE_PREFIX);
-  int len = prefix.length();
-
-  s.setFilter(QDir::Dirs | QDir::Hidden);
 
   QString dot = QString::fromLatin1(".");
   QString dotdot = QString::fromLatin1("..");
 
+  s.setFilter( QDir::All | QDir::Hidden | QDir::System );
+
   for (uint i=0; i<s.count(); i++) {
     QString name(s[i]);
@@ -632,10 +630,29 @@ void KUser::copyDir(const QString &srcPa
 
     QString filename(s.filePath(name));
-    QDir dir(filename);
 
-    if (name.left(len) == prefix)
-      name = name.remove(0, len);
+    QFileInfo info(filename);
+    mode = 0;
+    if ( info.permission(QFileInfo::ReadOwner) ) mode |=  S_IRUSR;
+    if ( info.permission(QFileInfo::WriteOwner) ) mode |=  S_IWUSR;
+    if ( info.permission(QFileInfo::ExeOwner) ) mode |=  S_IXUSR;
+    if ( info.permission(QFileInfo::ReadGroup) ) mode |=  S_IRGRP;
+    if ( info.permission(QFileInfo::WriteGroup) ) mode |=  S_IWGRP;
+    if ( info.permission(QFileInfo::ExeGroup) ) mode |=  S_IXGRP;
+    if ( info.permission(QFileInfo::ReadOther) ) mode |=  S_IROTH;
+    if ( info.permission(QFileInfo::WriteOther) ) mode |=  S_IWOTH;
+    if ( info.permission(QFileInfo::ExeOther) ) mode |=  S_IXOTH;
+    
+    if ( info.isSymLink() ) {
+      QString link = info.readLink();
+      
+      if (symlink(QFile::encodeName(link),QFile::encodeName(d.filePath(name))) != 0) {
+        KMessageBox::error( 0, i18n("Error creating symlink %1.\nError: %2")
+                  .arg(d.filePath(s[i])).arg(QString::fromLocal8Bit(strerror(errno))) );
+      }
+    } else if ( info.isDir() ) {
+      QDir dir(filename);
 
     d.mkdir(name, FALSE);
+      copyDir(s.filePath(name), d.filePath(name));
 
     if (chown(QFile::encodeName(d.filePath(name)), p_uid, p_gid) != 0) {
@@ -644,24 +661,10 @@ void KUser::copyDir(const QString &srcPa
     }
 
-    if (chmod(QFile::encodeName(d.filePath(name)), st.st_mode & 07777) != 0) {
+      if (chmod(QFile::encodeName(d.filePath(name)), mode) != 0) {
       KMessageBox::error( 0, i18n("Cannot change permissions on folder %1.\nError: %2")
                   .arg(d.filePath(s[i])).arg(QString::fromLocal8Bit(strerror(errno))) );
     }
 
-    copyDir(s.filePath(name), d.filePath(name));
-  }
-
-  s.setFilter(QDir::Files | QDir::Hidden);
-
-  for (uint i=0; i<s.count(); i++) {
-    QString name(s[i]);
-
-    QString filename(s.filePath(name));
-
-    stat(QFile::encodeName(filename), &st);
-
-    if (name.left(len) == prefix)
-      name = name.remove(0, len);
-
+    } else {
     if (copyFile(filename, d.filePath(name)) == -1) {
       continue;
@@ -673,9 +676,10 @@ void KUser::copyDir(const QString &srcPa
     }
 
-    if (chmod(QFile::encodeName(d.filePath(name)), st.st_mode & 07777) != 0) {
+      if (chmod(QFile::encodeName(d.filePath(name)), mode) != 0) {
       KMessageBox::error( 0, i18n("Cannot change permissions on file %1.\nError: %2")
                   .arg(d.filePath(s[i])).arg(QString::fromLocal8Bit(strerror(errno))) );
     }
   }
+  }
 }
 
@@ -684,6 +688,5 @@ int KUser::copySkel()
   QDir s(QFile::decodeName(SKELDIR));
   QDir d(p_dir);
-
-  umask(0777);
+  mode_t mode;
 
   if (!s.exists()) {
@@ -697,5 +700,7 @@ int KUser::copySkel()
   }
 
+  mode = umask(0007);
   copyDir(s.absPath(), d.absPath());
+  umask( mode );
 
   return 0;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic