コード例 #1
0
ファイル: cards_create.cpp プロジェクト: P-Linux/p_cards
void Cards_create::createBinaries(const string& configFileName,
	const string& packageName)
{
	Config config;
	Pkgrepo::parseConfig(configFileName, config);
	cout << "create of " << packageName << endl;
	string pkgdir = getPortDir(packageName);
	if (pkgdir == "" ) {
		m_actualError = PACKAGE_NOT_FOUND;
		treatErrors(packageName);
	}
	string timestamp;
	string commandName = "cards create: ";
	string message;
	int fdlog = -1;

	if ( config.logdir != "" ) {
		if ( ! createRecursiveDirs(config.logdir) ) {
			m_actualError = CANNOT_CREATE_DIRECTORY;
			treatErrors(config.logdir);
		}
		string logFile = config.logdir + "/" + packageName + ".log";
		unlink( logFile.c_str() );
		fdlog = open(logFile.c_str(),O_APPEND | O_WRONLY | O_CREAT, 0666 );
		if ( fdlog == -1 ) {
			m_actualError = CANNOT_OPEN_FILE;
			treatErrors(logFile);
		}
	}
	message = commandName + pkgdir + " package(s)";
	cout << message << endl;
	
	if ( config.logdir != "" ) {
		write( fdlog, message.c_str(), message.length());
		time_t startTime;
		time(&startTime);
		timestamp = ctime(&startTime);
		timestamp = " starting build " + timestamp;
		write( fdlog, timestamp.c_str(), timestamp.length());
		write( fdlog, "\n", 1 );
	}
	chdir( pkgdir.c_str() );
	
	string runscriptCommand = "sh";
	string cmd = "pkgmk";
	string args = "-d ";

	process makeprocess( cmd, args, fdlog );
	int result = 0 ;
	result = makeprocess.executeShell();
#ifndef NDEBUG
	cerr << result << endl;
#endif
	switch ( result )
	{
		case 1:
			throw runtime_error("General error");
			break;
		case 2:
			throw runtime_error("Error Invalid Pkgfile");
			break;
		case 3:
			throw runtime_error("Error Sources /build directory missing or missing read/write permission");
			break;
		case 4:
			throw runtime_error("Error during download of sources file(s)");
			break;
		case 5:
			throw runtime_error("Error during unpacking of sources file(s)");
			break;
		case 6:
			throw runtime_error("Error md5sum from sources Checking");
			break;
		case 7:
			throw runtime_error("Error footprint Checking");
			break;
		case 8:
			throw runtime_error("Error while running 'build()'");
			break;
		case 10:
			throw runtime_error("Error searching runtime dependancies");
			break;
		case 11:
			throw runtime_error(pkgdir + "/" + m_packageName +".info not found");
			break;
	}
	if (result > 0) { //TODO find out why return code is wrong
		m_actualError = CANNOT_PARSE_FILE;
		treatErrors(pkgdir+ "/Pkgfile");
	} 
	if ( config.logdir != "" ) {
		time_t endTime;
		time(&endTime);
		timestamp = ctime(&endTime);
		timestamp = commandName + "build done " + timestamp;

		write( fdlog, "\n", 1 );
		write( fdlog, timestamp.c_str(), timestamp.length());
		write( fdlog, "\n", 1 );
	}

	std::set<string> listOfPackages;
	if (findFile(listOfPackages, pkgdir) != 0) {
		m_actualError = CANNOT_READ_DIRECTORY;
		treatErrors(pkgdir);
	}

	// Let's install the found binaries now
	for (auto i : listOfPackages) {
		if (i.find("cards.tar")== string::npos )
			continue;
		m_packageFileName = pkgdir + "/" + i;
		ArchiveUtils packageArchive(m_packageFileName.c_str());
		string name = packageArchive.name();
		string version = packageArchive.version();
		message = "CREATED: " + name + " " + version;
		m_upgrade=0;
		buildDatabaseWithNameVersion();
		if ( checkPackageNameExist(name) ) {
			message = name + ": is ALLREADY installed";
			m_upgrade=1;
		}
		m_packageArchiveName = pkgdir + "/" + i;
		run();
		cout << message << endl;
		if ( config.logdir != "" ) {
			write( fdlog, message.c_str(), message.length());
			write( fdlog, "\n", 1 );
		}
		
	}
	if ( config.logdir != "" ) {
		time_t finishTime;
		time(&finishTime);
		timestamp = ctime(&finishTime);
		timestamp = commandName + "finish " + timestamp;
		write( fdlog, "\n", 1 );
		write( fdlog, timestamp.c_str(), timestamp.length());
		write( fdlog, "\n", 1 );
		close ( fdlog );
	}	
}
コード例 #2
0
ファイル: genlib.c プロジェクト: suokko/dealer
int main(int argc, char * const argv[])
{
  char *output = NULL;
  char buffer[1024];
  unsigned long gen = 100;
  long seed[33];
  char c;
  int mul = 0, seedpos = 0;
  FILE *out;
  int verbosity = 1, running = 0;
  struct timespec tp;
  char mode[] = "w";
  sfmt_t sfmt;
  int cores =
#if defined(WIN32) || defined(__WIN32)
    1;
#else
    sysconf (_SC_NPROCESSORS_CONF);
#endif
  unsigned long blocksize;
  struct process *process;

#ifdef _WIN32
  seed[0] = time(NULL);
#else
  clock_gettime(CLOCK_REALTIME, &tp);

  seed[0] = tp.tv_nsec + tp.tv_sec * 1000 * 1000 * 1000;
#endif
  while ((c = getopt(argc, argv, "hc:a:o:s:g:qv")) != -1) {
    switch (c) {
    default:
      usage(argv[0], 1, "ERROR: Unknown parameter %c\n", c);
      break;
    case 'h':
    case '?':
      usage(argv[0], 0, NULL);
      break;
    case 'g':
      gen = atoi(optarg);
      if (gen > INT_MAX)
        usage(argv[0], 2, "ERROR: Generate %lu is over max %d\n", gen, INT_MAX);
      break;
    case 'q':
      verbosity = 0;
      break;
    case 'c':
      cores = atoi(optarg);
      if (cores <= 0)
        usage(argv[0], 2, "ERROR: %d cores must be over zero", cores);
      break;
    case 'v':
      verbosity++;
      break;
    case 's':
      {
        char *startptr = optarg;
        /* Read seed from /dev/urandom */
        if (strcmp("dev", optarg) == 0) {
          FILE *dev = fopen("/dev/urandom", "r");
          int r;
          if (!dev) {
            perror("opening /dev/urandom");
            return 12;
          }
          do {
            r = fread(seed, sizeof seed[0], sizeof seed/sizeof seed[0], dev);
          } while (r != sizeof seed/sizeof seed[0] && errno == EINTR);

          if (r != sizeof seed/sizeof seed[0]) {
            perror("fread /dev/random");
            return 13;
          }
          seedpos = sizeof seed/sizeof seed[0];
          fclose(dev);
          break;
        }
        for (; seedpos < 33; seedpos++) {
          char *endptr;
          unsigned long s;
          errno = 0;
          s = strtol(startptr, &endptr, 10);
          if (endptr == startptr) {
            break;
          }
          if (errno != 0) {
            perror("sttrol");
            return errno;
          }
          startptr = endptr + 1;
          seed[seedpos] = s;
          if (*endptr == '\0') {
            seedpos++;
            break;
          }
        }
      }
      break;
    case 'a':
      mode[0] = 'a';
    case 'o':
      output = strdup(optarg);
      break;
    }
  }

  freopen("/dev/null", "r", stdin);

  process = alloca(sizeof(process[0])*cores);
  memset(process, 0, sizeof(process[0])*cores);

  /* Calculate reasonable block sizes for the cpu configuration */
  blocksize = gen;
  for (mul = 20; mul > 0; mul--) {
    long high = 1 << mul;

    if (gen >= (unsigned)(cores*high)) {
      blocksize = gen / (cores * mul);
      break;
    }
  }

  if (blocksize >= (1 << 20)/20)
    blocksize = (1 << 20)/20;

  int i, pos = 0;
  sfmt_init_by_array(&sfmt, (uint32_t*)&seed[0], (seedpos - 1)*(sizeof(seed[0])/sizeof(uint32_t)));
  pos = sprintf(buffer, "%ld", seed[0]);
  for (i = 1; i < seedpos; i++)
    pos += sprintf(&buffer[pos], ",%ld", seed[i]);


  if (verbosity >= 1)
    fprintf(stderr, "Generating %ld deals with %s seed. Each subprocess does %ld deals.\n",
        gen, buffer, blocksize);

  out = output ? fopen(output, mode) : stdout;

  if (!out) {
    perror("Can't open output file");
    return 10;
  }

  {
    int fd, maxfd = -1;
    int c;
    fd_set fds;
    fd_set rfds;

    FD_ZERO(&fds);

    for (c = 0; c < cores; c++) {
      unsigned long b = gen - scheduled > blocksize ?
                blocksize : gen - scheduled;

      if (b == 0)
        break;

      if ((fd = makeprocess(&process[c], b, sfmt_genrand_uint64(&sfmt), verbosity)) < 0)
        return 20;
      running++;

      if (fd > maxfd)
        maxfd = fd;

      FD_SET(fd, &fds);
    }

    /* Loop as long as we have subprocess active */
    while (running > 0) {
      int active;
      int p = 0;
      rfds = fds;
      /* Wait for any input */
      do {
        active = select(maxfd + 1, &rfds, NULL, NULL, NULL);
      } while (active == -1 && errno == EINTR);

      if (active <= 0) {
        perror("select");
        return 60;
      }
      /* Check which subprocess provided the input */
      for (; p < cores; p++) {
        if (FD_ISSET(process[p].fd, &rfds)) {
          errno = 0;
          while (fgets(buffer, sizeof buffer, process[p].f))
            parseLine(buffer, out, &process[p], gen, verbosity);

          /* Has the process exited? */
          if (feof(process[p].f)) {
            FD_CLR(process[p].fd, &fds);
            closeprocess(&process[p]);
            running--;
            /* Is there more blocks to shedule? */
            if (scheduled < gen) {
              unsigned long b = gen - scheduled > blocksize ?
                blocksize : gen - scheduled;

              if ((fd = makeprocess(&process[p], b, sfmt_genrand_uint64(&sfmt), verbosity)) < 0)
                return 20;

              running++;

              if (fd > maxfd)
                maxfd = fd;

              FD_SET(fd, &fds);
            }
            continue;
          }
          /* EWOULDBLOCK and EINTR can happen during normal operation */
          if (errno != EWOULDBLOCK && errno != EINTR) {
            perror("fgets");
            return 50;
          }
        }
      }
    }
  }

  fclose(out);
  return 0;
}