int main(int argc, char** argv) { //check if args correctly entered if(argc > 6) { printf("Usage : ls <Options> directory \n"); exit(EXIT_FAILURE); } char *path = malloc(100); if (argc > 1 && argv[argc - 1][0] != '-') strcpy(path, argv[argc - 1]); else strcpy(path, "."); int j; for(j = 0; j < argc; j++) { if(argv[j][0] == '-') if(!isValid(argv[j][1])) { printf("ls : invalid option"); exit(EXIT_FAILURE); } } //set the flag bits int i; bool all = false, size = false, list = false, inode = false; for(i = 0; i < argc; i++) { switch (argv[i][1]) { case 'S': size = true; break; case 'a': all = true; break; case 'l': list = true; break; case 'i': inode = true; break; } } if (scanDirs(path, all, size) < 0) exit(EXIT_FAILURE); if (printDirs(path, list, inode) < 0) exit(EXIT_FAILURE); return (EXIT_SUCCESS); }
int main (int argc, char **argv) { FcStrSet *dirs; FcStrList *list; FcBool verbose = FcFalse; FcBool force = FcFalse; FcBool really_force = FcFalse; FcBool systemOnly = FcFalse; FcConfig *config; int i; int changed; int ret; #if HAVE_GETOPT_LONG || HAVE_GETOPT int c; #if HAVE_GETOPT_LONG while ((c = getopt_long (argc, argv, "frsVvh", longopts, NULL)) != -1) #else while ((c = getopt (argc, argv, "frsVvh")) != -1) #endif { switch (c) { case 'r': really_force = FcTrue; /* fall through */ case 'f': force = FcTrue; break; case 's': systemOnly = FcTrue; break; case 'V': fprintf (stderr, "fontconfig version %d.%d.%d\n", FC_MAJOR, FC_MINOR, FC_REVISION); exit (0); case 'v': verbose = FcTrue; break; case 'h': usage (argv[0], 0); default: usage (argv[0], 1); } } i = optind; #else i = 1; #endif if (systemOnly) FcConfigEnableHome (FcFalse); config = FcInitLoadConfig (); if (!config) { fprintf (stderr, "%s: Can't init font config library\n", argv[0]); return 1; } FcConfigSetCurrent (config); if (argv[i]) { dirs = FcStrSetCreate (); if (!dirs) { fprintf (stderr, "%s: Can't create list of directories\n", argv[0]); return 1; } while (argv[i]) { if (!FcStrSetAddFilename (dirs, (FcChar8 *) argv[i])) { fprintf (stderr, "%s: Can't add directory\n", argv[0]); return 1; } i++; } list = FcStrListCreate (dirs); FcStrSetDestroy (dirs); } else list = FcConfigGetConfigDirs (config); if ((processed_dirs = FcStrSetCreate()) == NULL) { fprintf(stderr, "Cannot malloc\n"); return 1; } changed = 0; ret = scanDirs (list, config, force, really_force, verbose, &changed); /* * Try to create CACHEDIR.TAG anyway. * This expects the fontconfig cache directory already exists. * If it doesn't, it won't be simply created. */ FcCacheCreateTagFile (config); FcStrSetDestroy (processed_dirs); cleanCacheDirectories (config, verbose); /* * Now we need to sleep a second (or two, to be extra sure), to make * sure that timestamps for changes after this run of fc-cache are later * then any timestamps we wrote. We don't use gettimeofday() because * sleep(3) can't be interrupted by a signal here -- this isn't in the * library, and there aren't any signals flying around here. */ FcConfigDestroy (config); FcFini (); if (changed) sleep (2); if (verbose) printf ("%s: %s\n", argv[0], ret ? "failed" : "succeeded"); return ret; }
static int scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force, FcBool verbose, int *changed) { int ret = 0; const FcChar8 *dir; FcStrSet *subdirs; FcStrList *sublist; FcCache *cache; struct stat statb; FcBool was_valid; int i; /* * Now scan all of the directories into separate databases * and write out the results */ while ((dir = FcStrListNext (list))) { if (verbose) { printf ("%s: ", dir); fflush (stdout); } if (!dir) { if (verbose) printf ("skipping, no such directory\n"); continue; } if (FcStrSetMember (processed_dirs, dir)) { if (verbose) printf ("skipping, looped directory detected\n"); continue; } if (stat ((char *) dir, &statb) == -1) { switch (errno) { case ENOENT: case ENOTDIR: if (verbose) printf ("skipping, no such directory\n"); break; default: fprintf (stderr, "\"%s\": ", dir); perror (""); ret++; break; } continue; } if (!S_ISDIR (statb.st_mode)) { fprintf (stderr, "\"%s\": not a directory, skipping\n", dir); continue; } if (really_force) FcDirCacheUnlink (dir, config); cache = NULL; was_valid = FcFalse; if (!force) { cache = FcDirCacheLoad (dir, config, NULL); if (cache) was_valid = FcTrue; } if (!cache) { (*changed)++; cache = FcDirCacheRead (dir, FcTrue, config); if (!cache) { fprintf (stderr, "%s: error scanning\n", dir); ret++; continue; } } if (was_valid) { if (verbose) printf ("skipping, existing cache is valid: %d fonts, %d dirs\n", FcCacheNumFont (cache), FcCacheNumSubdir (cache)); } else { if (verbose) printf ("caching, new cache contents: %d fonts, %d dirs\n", FcCacheNumFont (cache), FcCacheNumSubdir (cache)); if (!FcDirCacheValid (dir)) { fprintf (stderr, "%s: failed to write cache\n", dir); (void) FcDirCacheUnlink (dir, config); ret++; } } subdirs = FcStrSetCreate (); if (!subdirs) { fprintf (stderr, "%s: Can't create subdir set\n", dir); ret++; FcDirCacheUnload (cache); continue; } for (i = 0; i < FcCacheNumSubdir (cache); i++) FcStrSetAdd (subdirs, FcCacheSubdir (cache, i)); FcDirCacheUnload (cache); sublist = FcStrListCreate (subdirs); FcStrSetDestroy (subdirs); if (!sublist) { fprintf (stderr, "%s: Can't create subdir list\n", dir); ret++; continue; } FcStrSetAdd (processed_dirs, dir); ret += scanDirs (sublist, config, force, really_force, verbose, changed); } FcStrListDone (list); return ret; }
char *ccFileTempDirGet(void) { if(userDir == NULL) scanDirs(); return tempDir; }
char *ccFileDataDirGet(void) { if(userDir == NULL) scanDirs(); return dataDir; }
char *ccFileUserDirGet(void) { if(userDir == NULL) scanDirs(); return userDir; }
void ScanThread::operator() () try { std::clog << "Scanning thread started" << std::endl; while (!stop_) { changed_ = false; if (restart_) { // initially scan directories specified in settings Settings::Directories dirs = settings_.getSettings().directories; restart_ = false; try { scanDir(ROOT_RECORD_ID, dirs.cbegin(), dirs.cend()); saveChangesToDB(); } catch(std::exception const& ex) { std::cerr << "Error scanning root directories: " << ex.what() << std::endl; } } scanDirs(); saveChangesToDB(); if (!changed_ && !stop_) { struct FackeLock { void lock() {} void unlock() {} } fackeLock; cond_.wait_for(fackeLock, sleepTime_); if (sleepTime_ < std::chrono::seconds(5)) { sleepTime_ += std::chrono::seconds(1); } } else { sleepTime_ = std::chrono::seconds(2); std::this_thread::yield(); } } std::clog << "Scanning thread stopped" << std::endl; } catch(const std::exception& ex) { std::cerr << "Error in the file scan thread: " << ex.what() << std::endl; } catch(...) { std::cerr << "Unexpected error in the file scan thread: " << std::endl; }