void KStandardDirs::createSpecialResource(const char *type) { char hostname[256]; hostname[0] = 0; gethostname(hostname, 255); QString dir = QString("%1%2-%3").arg(localkdedir()).arg(type).arg(hostname); char link[1024]; link[1023] = 0; int result = readlink(QFile::encodeName(dir).data(), link, 1023); bool relink = (result == -1) && (errno == ENOENT); if(result > 0) { link[result] = 0; if(!QDir::isRelativePath(link)) { KDE_struct_stat stat_buf; int res = KDE_lstat(link, &stat_buf); if((res == -1) && (errno == ENOENT)) { relink = true; } else if((res == -1) || (!S_ISDIR(stat_buf.st_mode))) { fprintf(stderr, "Error: \"%s\" is not a directory.\n", link); relink = true; } else if(stat_buf.st_uid != getuid()) { fprintf(stderr, "Error: \"%s\" is owned by uid %d instead of uid %d.\n", link, stat_buf.st_uid, getuid()); relink = true; } } } if(relink) { QString srv = findExe(QString::fromLatin1("lnusertemp"), kfsstnd_defaultbindir()); if(srv.isEmpty()) srv = findExe(QString::fromLatin1("lnusertemp")); if(!srv.isEmpty()) { system(QFile::encodeName(srv) + " " + type); result = readlink(QFile::encodeName(dir).data(), link, 1023); } } if(result > 0) { link[result] = 0; if(link[0] == '/') dir = QFile::decodeName(link); else dir = QDir::cleanDirPath(dir + QFile::decodeName(link)); } addResourceDir(type, dir + '/'); }
QString KStandardDirs::findExe( const QString& appname, const QString& pstr, bool ignore) { #ifdef Q_WS_WIN QString real_appname = appname + ".exe"; #else QString real_appname = appname; #endif QFileInfo info; // absolute or relative path given if (real_appname.find(QDir::separator()) >= 0) { info.setFile( real_appname ); if( info.exists() && ( ignore || info.isExecutable() ) && info.isFile() ) { return info.absFilePath(); } return QString::null; } QString p = QString("%1/%2").arg(kfsstnd_defaultbindir()).arg(real_appname); info.setFile( p ); if( info.exists() && ( ignore || info.isExecutable() ) && ( info.isFile() || info.isSymLink() ) ) { return p; } QStringList exePaths = systemPaths( pstr ); for (QStringList::ConstIterator it = exePaths.begin(); it != exePaths.end(); ++it) { p = (*it) + "/"; p += real_appname; // Check for executable in this tokenized path info.setFile( p ); if( info.exists() && ( ignore || info.isExecutable() ) && ( info.isFile() || info.isSymLink() ) ) { return p; } } // If we reach here, the executable wasn't found. // So return empty string. return QString::null; }