QString KStandardDirs::saveLocation(const char *type, const QString& suffix, bool create) const { checkConfig(); QString *pPath = savelocations.find(type); if (!pPath) { QStringList *dirs = relatives.find(type); if (!dirs && ( (strcmp(type, "socket") == 0) || (strcmp(type, "tmp") == 0) || (strcmp(type, "cache") == 0) )) { (void) resourceDirs(type); // Generate socket|tmp|cache resource. dirs = relatives.find(type); // Search again. } if (dirs) { // Check for existence of typed directory + suffix if (strncmp(type, "xdgdata-", 8) == 0) pPath = new QString(realPath(localxdgdatadir() + dirs->last())); else if (strncmp(type, "xdgconf-", 8) == 0) pPath = new QString(realPath(localxdgconfdir() + dirs->last())); else pPath = new QString(realPath(localkdedir() + dirs->last())); } else { dirs = absolutes.find(type); if (!dirs) qFatal("KStandardDirs: The resource type %s is not registered", type); pPath = new QString(realPath(dirs->last())); } savelocations.insert(type, pPath); } QString fullPath = *pPath + (pPath->endsWith("/") ? "" : "/") + suffix; KDE_struct_stat st; if (KDE_stat(QFile::encodeName(fullPath), &st) != 0 || !(S_ISDIR(st.st_mode))) { if(!create) { #ifndef NDEBUG kdDebug() << QString("save location %1 doesn't exist").arg(fullPath) << endl; #endif return fullPath; } if(!makeDir(fullPath, 0700)) { return fullPath; } dircache.remove(type); } if (!fullPath.endsWith("/")) fullPath += "/"; return fullPath; }
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 + '/'); }