Esempio n. 1
0
const std::vector<int>& City::get_requests() const
{
	refresh_intermediates();

#if 0
	for (auto it = request_indices.begin(); it != request_indices.end(); ++it)
	{
		int to = *it;
		if (get_stop(to)->get_operation() == Store
				|| get_stop(to)->get_operation() == UnStore
				|| get_stop(to)->get_operation() == Dump)
		{
			std::cout << "Error" << get_stop(to)->get_operation() << std::endl;
			die();
		}
	}
#endif

	return request_indices;
}
Esempio n. 2
0
static void menu_draw_row_callback(GContext* ctx, const Layer *cell_layer, MenuIndex *cell_index, void *callback_context) {

    stop_t *stop;
    switch (cell_index->section) {
    case MENU_SECTION_MAIN:
        stop = get_stop(cell_index->row);
        if (stop == NULL) {
            return;
        }

        menu_cell_basic_draw(ctx, cell_layer, stop->name, NULL, NULL);
        break;
    }
}
Esempio n. 3
0
static void menu_select_click_callback(MenuLayer* menu_layer, MenuIndex* cell_index, void* callback_context) {

    realtime_transport_type_t *ttype = (realtime_transport_type_t *) callback_context;

    if (!layer_get_hidden(transport_type_to_loadinglayer_map[*ttype])) {
        APP_LOG(APP_LOG_LEVEL_DEBUG, "No clicks allowed while loading layer is visible");
        return;
    }

    stop_t *stop;
    switch (cell_index->section) {
    case MENU_SECTION_MAIN:
        stop = get_stop(cell_index->row);
        if (stop == NULL) {
            return;
        }

        show_departures_window(stop->id, *ttype, true);
        break;

    }
}
Esempio n. 4
0
static int				/* O - 0 = success, 1 = fail */
make_subpackage(const char     *prodname,
					/* I - Product short name */
                const char     *directory,
					/* I - Directory for distribution files */
                const char     *platname,
					/* I - Platform name */
                dist_t         *dist,	/* I - Distribution information */
	        struct utsname *platform,
					/* I - Platform information */
		const char     *subpackage)
					/* I - Subpackage */
{
  int			i, j;		/* Looping vars */
  const char		*header;	/* Dependency header string */
  FILE			*fp;		/* Control file */
  char			prodfull[255],	/* Full name of product */
			name[1024],	/* Full product name */
			filename[1024];	/* Destination filename */
  command_t		*c;		/* Current command */
  depend_t		*d;		/* Current dependency */
  file_t		*file;		/* Current distribution file */
  struct passwd		*pwd;		/* Pointer to user record */
  struct group		*grp;		/* Pointer to group record */
  const char		*runlevels,	/* Run levels */
			*rlptr;		/* Pointer into runlevels */
  static const char	*depends[] =	/* Dependency names */
			{
			  "Depends:",
			  "Conflicts:",
			  "Replaces:",
			  "Provides:"
			};


 /*
  * Figure out the full name of the distribution...
  */

  if (subpackage)
    snprintf(prodfull, sizeof(prodfull), "%s-%s", prodname, subpackage);
  else
    strlcpy(prodfull, prodname, sizeof(prodfull));

 /*
  * Then the subdirectory name...
  */

  if (dist->release[0])
    snprintf(name, sizeof(name), "%s-%s-%s", prodfull, dist->version,
             dist->release);
  else
    snprintf(name, sizeof(name), "%s-%s", prodfull, dist->version);

  if (platname[0])
  {
    strlcat(name, "-", sizeof(name));
    strlcat(name, platname, sizeof(name));
  }

  if (Verbosity)
    printf("Creating Debian %s distribution...\n", name);

 /*
  * Write the control file for DPKG...
  */

  if (Verbosity)
    puts("Creating control file...");

  snprintf(filename, sizeof(filename), "%s/%s", directory, name);
  mkdir(filename, 0777);
  strlcat(filename, "/DEBIAN", sizeof(filename));
  mkdir(filename, 0777);
  chmod(filename, 0755);

  strlcat(filename, "/control", sizeof(filename));

  if ((fp = fopen(filename, "w")) == NULL)
  {
    fprintf(stderr, "epm: Unable to create control file \"%s\" - %s\n", filename,
            strerror(errno));
    return (1);
  }

  fprintf(fp, "Package: %s\n", prodfull);
  if (dist->release[0])
    fprintf(fp, "Version: %s-%s\n", dist->version, dist->release);
  else
    fprintf(fp, "Version: %s\n", dist->version);
  fprintf(fp, "Maintainer: %s\n", dist->vendor);

 /*
  * The Architecture attribute needs to match the uname info
  * (which we change in get_platform to a common name)
  */

  if (!strcmp(platform->machine, "intel"))
    fputs("Architecture: i386\n", fp);
  else if (!strcmp(platform->machine, "ppc"))
    fputs("Architecture: powerpc\n", fp);
  else
    fprintf(fp, "Architecture: %s\n", platform->machine);

  fprintf(fp, "Description: %s\n", dist->product);
  fprintf(fp, " Copyright: %s\n", dist->copyright);
  for (i = 0; i < dist->num_descriptions; i ++)
    if (dist->descriptions[i].subpackage == subpackage)
      fprintf(fp, " %s\n", dist->descriptions[i].description);

  for (j = DEPEND_REQUIRES; j <= DEPEND_PROVIDES; j ++)
  {
    for (i = dist->num_depends, d = dist->depends; i > 0; i --, d ++)
      if (d->type == j && d->subpackage == subpackage)
	break;

    if (i)
    {
      for (header = depends[j]; i > 0; i --, d ++, header = ",")
	if (d->type == j && d->subpackage == subpackage)
	{
	  if (!strcmp(d->product, "_self"))
            fprintf(fp, "%s %s", header, prodname);
	  else
            fprintf(fp, "%s %s", header, d->product);

	  if (d->vernumber[0] == 0)
	  {
	    if (d->vernumber[1] < INT_MAX)
              fprintf(fp, " (<= %s)", d->version[1]);
	  }
	  else
	  {
	    if (d->vernumber[1] < INT_MAX)
	      fprintf(fp, " (>= %s, <= %s)", d->version[0], d->version[1]);
	    else
	      fprintf(fp, " (>= %s)", d->version[0]);
	  }
	}

      putc('\n', fp);
    }
  }

  fclose(fp);

 /*
  * Write the preinst file for DPKG...
  */

  for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++)
    if (c->type == COMMAND_PRE_INSTALL && c->subpackage == subpackage)
      break;

  if (i)
  {
    if (Verbosity)
      puts("Creating preinst script...");

    snprintf(filename, sizeof(filename), "%s/%s/DEBIAN/preinst", directory, name);

    if ((fp = fopen(filename, "w")) == NULL)
    {
      fprintf(stderr, "epm: Unable to create script file \"%s\" - %s\n", filename,
              strerror(errno));
      return (1);
    }

    fchmod(fileno(fp), 0755);

    fputs("#!/bin/sh\n", fp);
    fputs("# " EPM_VERSION "\n", fp);

    for (; i > 0; i --, c ++)
      if (c->type == COMMAND_PRE_INSTALL && c->subpackage == subpackage)
        fprintf(fp, "%s\n", c->command);

    fclose(fp);
  }

 /*
  * Write the postinst file for DPKG...
  */

  for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++)
    if (c->type == COMMAND_POST_INSTALL && c->subpackage == subpackage)
      break;

  if (!i)
    for (i = dist->num_files, file = dist->files; i > 0; i --, file ++)
      if (tolower(file->type) == 'i' && file->subpackage == subpackage)
        break;

  if (i)
  {
    if (Verbosity)
      puts("Creating postinst script...");

    snprintf(filename, sizeof(filename), "%s/%s/DEBIAN/postinst", directory, name);

    if ((fp = fopen(filename, "w")) == NULL)
    {
      fprintf(stderr, "epm: Unable to create script file \"%s\" - %s\n", filename,
              strerror(errno));
      return (1);
    }

    fchmod(fileno(fp), 0755);

    fputs("#!/bin/sh\n", fp);
    fputs("# " EPM_VERSION "\n", fp);

    for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++)
      if (c->type == COMMAND_POST_INSTALL && c->subpackage == subpackage)
        fprintf(fp, "%s\n", c->command);

    for (i = dist->num_files, file = dist->files; i > 0; i --, file ++)
      if (tolower(file->type) == 'i' && file->subpackage == subpackage)
      {
        runlevels = get_runlevels(file, "02345");

        fprintf(fp, "update-rc.d %s start %02d", file->dst,
	        get_start(file, 99));

        for (rlptr = runlevels; isdigit(*rlptr & 255); rlptr ++)
	  if (*rlptr != '0')
	    fprintf(fp, " %c", *rlptr);

	if (strchr(runlevels, '0') != NULL)
          fprintf(fp, " . stop %02d 0", get_stop(file, 0));

        fputs(" . >/dev/null\n", fp);
        fprintf(fp, "/etc/init.d/%s start\n", file->dst);
      }

    fclose(fp);
  }

 /*
  * Write the prerm file for DPKG...
  */

  for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++)
    if (c->type == COMMAND_PRE_REMOVE && c->subpackage == subpackage)
      break;

  if (!i)
    for (i = dist->num_files, file = dist->files; i > 0; i --, file ++)
      if (tolower(file->type) == 'i' && file->subpackage == subpackage)
        break;

  if (i)
  {
    if (Verbosity)
      puts("Creating prerm script...");

    snprintf(filename, sizeof(filename), "%s/%s/DEBIAN/prerm", directory, name);

    if ((fp = fopen(filename, "w")) == NULL)
    {
      fprintf(stderr, "epm: Unable to create script file \"%s\" - %s\n", filename,
              strerror(errno));
      return (1);
    }

    fchmod(fileno(fp), 0755);

    fputs("#!/bin/sh\n", fp);
    fputs("# " EPM_VERSION "\n", fp);

    for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++)
      if (c->type == COMMAND_PRE_REMOVE && c->subpackage == subpackage)
        fprintf(fp, "%s\n", c->command);

    for (i = dist->num_files, file = dist->files; i > 0; i --, file ++)
      if (tolower(file->type) == 'i' && file->subpackage == subpackage)
        fprintf(fp, "/etc/init.d/%s stop\n", file->dst);

    fclose(fp);
  }

 /*
  * Write the postrm file for DPKG...
  */

  for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++)
    if (c->type == COMMAND_POST_REMOVE && c->subpackage == subpackage)
      break;

  if (!i)
    for (i = dist->num_files, file = dist->files; i > 0; i --, file ++)
      if (tolower(file->type) == 'i' && file->subpackage == subpackage)
        break;

  if (i)
  {
    if (Verbosity)
      puts("Creating postrm script...");

    snprintf(filename, sizeof(filename), "%s/%s/DEBIAN/postrm", directory, name);

    if ((fp = fopen(filename, "w")) == NULL)
    {
      fprintf(stderr, "epm: Unable to create script file \"%s\" - %s\n", filename,
              strerror(errno));
      return (1);
    }

    fchmod(fileno(fp), 0755);

    fputs("#!/bin/sh\n", fp);
    fputs("# " EPM_VERSION "\n", fp);

    for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++)
      if (c->type == COMMAND_POST_REMOVE && c->subpackage == subpackage)
	fprintf(fp, "%s\n", c->command);

    for (i = dist->num_files, file = dist->files; i > 0; i --, file ++)
      if (tolower(file->type) == 'i' && file->subpackage == subpackage)
      {
        fputs("if [ purge = \"$1\" ]; then\n", fp);
        fprintf(fp, "	update-rc.d %s remove >/dev/null\n", file->dst);
        fputs("fi\n", fp);
      }

    fclose(fp);
  }

 /*
  * Write the conffiles file for DPKG...
  */

  if (Verbosity)
    puts("Creating conffiles...");

  snprintf(filename, sizeof(filename), "%s/%s/DEBIAN/conffiles", directory, name);

  if ((fp = fopen(filename, "w")) == NULL)
  {
    fprintf(stderr, "epm: Unable to create script file \"%s\" - %s\n", filename,
            strerror(errno));
    return (1);
  }

  for (i = dist->num_files, file = dist->files; i > 0; i --, file ++)
    if (tolower(file->type) == 'c' && file->subpackage == subpackage)
      fprintf(fp, "%s\n", file->dst);
    else if (tolower(file->type) == 'i' && file->subpackage == subpackage)
      fprintf(fp, "/etc/init.d/%s\n", file->dst);

  fclose(fp);

 /*
  * Copy the files over...
  */

  if (Verbosity)
    puts("Copying temporary distribution files...");

  for (i = dist->num_files, file = dist->files; i > 0; i --, file ++)
  {
    if (file->subpackage != subpackage)
      continue;

   /*
    * Find the username and groupname IDs...
    */

    pwd = getpwnam(file->user);
    grp = getgrnam(file->group);

    endpwent();
    endgrent();

   /*
    * Copy the file or make the directory or make the symlink as needed...
    */

    switch (tolower(file->type))
    {
      case 'c' :
      case 'f' :
          snprintf(filename, sizeof(filename), "%s/%s%s", directory, name,
	           file->dst);

	  if (Verbosity > 1)
	    printf("%s -> %s...\n", file->src, filename);

	  if (copy_file(filename, file->src, file->mode, pwd ? pwd->pw_uid : 0,
			grp ? grp->gr_gid : 0))
	    return (1);
          break;
      case 'i' :
          snprintf(filename, sizeof(filename), "%s/%s/etc/init.d/%s",
	           directory, name, file->dst);

	  if (Verbosity > 1)
	    printf("%s -> %s...\n", file->src, filename);

	  if (copy_file(filename, file->src, file->mode, pwd ? pwd->pw_uid : 0,
			grp ? grp->gr_gid : 0))
	    return (1);
          break;
      case 'd' :
          snprintf(filename, sizeof(filename), "%s/%s%s", directory, name,
	           file->dst);

	  if (Verbosity > 1)
	    printf("Directory %s...\n", filename);

          make_directory(filename, file->mode, pwd ? pwd->pw_uid : 0,
			 grp ? grp->gr_gid : 0);
          break;
      case 'l' :
          snprintf(filename, sizeof(filename), "%s/%s%s", directory, name,
	           file->dst);

	  if (Verbosity > 1)
	    printf("%s -> %s...\n", file->src, filename);

          make_link(filename, file->src);
          break;
    }
  }

 /*
  * Build the distribution from the spec file...
  */

  if (Verbosity)
    printf("Building Debian %s binary distribution...\n", name);

  if (run_command(directory, "dpkg --build %s", name))
    return (1);

 /*
  * Remove temporary files...
  */

  if (!KeepFiles)
  {
    if (Verbosity)
      printf("Removing temporary %s distribution files...\n", name);

    snprintf(filename, sizeof(filename), "%s/%s", directory, name);
    unlink_directory(filename);
  }

  return (0);
}
Esempio n. 5
0
static int				/* O - 0 on success, -1 on error */
write_spec(int        format,		/* I - Subformat */
           const char *prodname,	/* I - Product name */
	   dist_t     *dist,		/* I - Distribution */
           FILE       *fp,		/* I - Spec file */
           const char *subpackage)	/* I - Subpackage name */
{
  int		i;			/* Looping var */
  char		name[1024];		/* Full product name */
  const char	*product;		/* Product to depend on */
  file_t	*file;			/* Current distribution file */
  command_t	*c;			/* Current command */
  depend_t	*d;			/* Current dependency */
  const char	*runlevels;		/* Run levels */
  int		number;			/* Start/stop number */
  int		have_commands;		/* Have commands in current section? */


 /*
  * Get the name we'll use for the subpackage...
  */

  if (subpackage)
    snprintf(name, sizeof(name), " %s", subpackage);
  else
    name[0] = '\0';

 /*
  * Common stuff...
  */

  if (subpackage)
  {
    fprintf(fp, "%%package%s\n", name);
    fprintf(fp, "Summary: %s", dist->product);

    for (i = 0; i < dist->num_descriptions; i ++)
      if (dist->descriptions[i].subpackage == subpackage)
	break;

    if (i < dist->num_descriptions)
    {
      char	line[1024],		/* First line of description... */
		*ptr;			/* Pointer into line */


      strlcpy(line, dist->descriptions[i].description, sizeof(line));
      if ((ptr = strchr(line, '\n')) != NULL)
        *ptr = '\0';

      fprintf(fp, " - %s", line);
    }
    fputs("\n", fp);
  }
  else
    fprintf(fp, "Summary: %s\n", dist->product);

  fputs("Group: Applications\n", fp);

 /*
  * List all of the dependencies...
  */

  for (i = dist->num_depends, d = dist->depends; i > 0; i --, d ++)
  {
    if (d->subpackage != subpackage)
      continue;

    if (!strcmp(d->product, "_self"))
      product = prodname;
    else
      product = d->product;

    if (d->type == DEPEND_REQUIRES)
      fprintf(fp, "Requires: %s", product);
    else if (d->type == DEPEND_PROVIDES)
      fprintf(fp, "Provides: %s", product);
    else if (d->type == DEPEND_REPLACES)
      fprintf(fp, "Obsoletes: %s", product);
    else
      fprintf(fp, "Conflicts: %s", product);

    if (d->vernumber[0] == 0)
    {
      if (d->vernumber[1] < INT_MAX)
        fprintf(fp, " <= %s\n", d->version[1]);
      else
        putc('\n', fp);
    }
    else if (d->vernumber[0] && d->vernumber[1] < INT_MAX)
    {
      if (d->vernumber[0] < INT_MAX && d->vernumber[1] < INT_MAX)
        fprintf(fp, " >= %s, %s <= %s\n", d->version[0], product,
	        d->version[1]);
    }
    else if (d->vernumber[0] != d->vernumber[1])
      fprintf(fp, " >= %s\n", d->version[0]);
    else
      fprintf(fp, " = %s\n", d->version[0]);
  }

 /*
  * Pre/post install commands...
  */

  for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++)
    if (c->type == COMMAND_PRE_INSTALL && c->subpackage == subpackage)
      break;

  if (i > 0)
  {
    fprintf(fp, "%%pre%s\n", name);
    for (; i > 0; i --, c ++)
      if (c->type == COMMAND_PRE_INSTALL && c->subpackage == subpackage)
	fprintf(fp, "%s\n", c->command);
  }

  for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++)
    if (c->type == COMMAND_POST_INSTALL && c->subpackage == subpackage)
      break;

  if (i > 0)
  {
    have_commands = 1;

    fprintf(fp, "%%post%s\n", name);
    for (; i > 0; i --, c ++)
      if (c->type == COMMAND_POST_INSTALL && c->subpackage == subpackage)
	fprintf(fp, "%s\n", c->command);

  }
  else
    have_commands = 0;

  for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++)
    if (c->type == COMMAND_LITERAL && c->subpackage == subpackage &&
        !strcmp(c->section, "spec"))
      break;

  if (i > 0)
  {
    for (; i > 0; i --, c ++)
      if (c->type == COMMAND_LITERAL && c->subpackage == subpackage &&
	  !strcmp(c->section, "spec"))
	fprintf(fp, "%s\n", c->command);
  }

  for (i = dist->num_files, file = dist->files; i > 0; i --, file ++)
    if (tolower(file->type) == 'i' && file->subpackage == subpackage)
      break;

  if (i)
  {
    if (!have_commands)
      fprintf(fp, "%%post%s\n", name);

    fputs("if test \"x$1\" = x1; then\n", fp);
    fputs("	echo Setting up init scripts...\n", fp);

    if (format == PACKAGE_LSB)
    {
     /*
      * Use LSB commands to install the init scripts...
      */

      for (; i > 0; i --, file ++)
	if (tolower(file->type) == 'i' && file->subpackage == subpackage)
	{
	  fprintf(fp, "	/usr/lib/lsb/install_initd /etc/init.d/%s\n", file->dst);
	  fprintf(fp, "	/etc/init.d/%s start\n", file->dst);
	}
    }
    else
    {
     /*
      * Find where the frigging init scripts go...
      */

      fputs("	rcdir=\"\"\n", fp);
      fputs("	for dir in /sbin/rc.d /sbin /etc/rc.d /etc ; do\n", fp);
      fputs("		if test -d $dir/rc3.d -o -h $dir/rc3.d; then\n", fp);
      fputs("			rcdir=\"$dir\"\n", fp);
      fputs("		fi\n", fp);
      fputs("	done\n", fp);
      fputs("	if test \"$rcdir\" = \"\" ; then\n", fp);
      fputs("		echo Unable to determine location of startup scripts!\n", fp);
      fputs("	else\n", fp);
      for (; i > 0; i --, file ++)
	if (tolower(file->type) == 'i' && file->subpackage == subpackage)
	{
	  fputs("		if test -d $rcdir/init.d; then\n", fp);
	  qprintf(fp, "			/bin/rm -f $rcdir/init.d/%s\n", file->dst);
	  qprintf(fp, "			/bin/ln -s %s/init.d/%s "
		      "$rcdir/init.d/%s\n", SoftwareDir, file->dst, file->dst);
	  fputs("		else\n", fp);
	  fputs("			if test -d /etc/init.d; then\n", fp);
	  qprintf(fp, "				/bin/rm -f /etc/init.d/%s\n", file->dst);
	  qprintf(fp, "				/bin/ln -s %s/init.d/%s "
		      "/etc/init.d/%s\n", SoftwareDir, file->dst, file->dst);
	  fputs("			fi\n", fp);
	  fputs("		fi\n", fp);

	  for (runlevels = get_runlevels(dist->files + i, "0123456");
	       isdigit(*runlevels & 255);
	       runlevels ++)
	  {
	    if (*runlevels == '0')
	      number = get_stop(file, 0);
	    else
	      number = get_start(file, 99);

	    qprintf(fp, "		/bin/rm -f $rcdir/rc%c.d/%c%02d%s\n", *runlevels,
		    (*runlevels == '0' || *runlevels == '1' ||
		     *runlevels == '6') ? 'K' : 'S', number, file->dst);
	    qprintf(fp, "		/bin/ln -s %s/init.d/%s "
			"$rcdir/rc%c.d/%c%02d%s\n", SoftwareDir, file->dst,
		    *runlevels,
		    (*runlevels == '0' || *runlevels == '1' ||
		     *runlevels == '6') ? 'K' : 'S', number, file->dst);
	  }

	  qprintf(fp, "		%s/init.d/%s start\n", SoftwareDir, file->dst);
	}

      fputs("	fi\n", fp);
    }

    fputs("fi\n", fp);
  }

  for (i = dist->num_files, file = dist->files; i > 0; i --, file ++)
    if (tolower(file->type) == 'i' && file->subpackage == subpackage)
      break;

  if (i)
  {
    have_commands = 1;

    fprintf(fp, "%%preun%s\n", name);
    fputs("if test \"x$1\" = x0; then\n", fp);
    fputs("	echo Cleaning up init scripts...\n", fp);

    if (format == PACKAGE_LSB)
    {
     /*
      * Use LSB commands to remove the init scripts...
      */

      for (; i > 0; i --, file ++)
	if (tolower(file->type) == 'i' && file->subpackage == subpackage)
	{
	  fprintf(fp, "	/etc/init.d/%s stop\n", file->dst);
	  fprintf(fp, "	/usr/lib/lsb/remove_initd /etc/init.d/%s\n", file->dst);
	}
    }
    else
    {
     /*
      * Find where the frigging init scripts go...
      */

      fputs("	rcdir=\"\"\n", fp);
      fputs("	for dir in /sbin/rc.d /sbin /etc/rc.d /etc ; do\n", fp);
      fputs("		if test -d $dir/rc3.d -o -h $dir/rc3.d; then\n", fp);
      fputs("			rcdir=\"$dir\"\n", fp);
      fputs("		fi\n", fp);
      fputs("	done\n", fp);
      fputs("	if test \"$rcdir\" = \"\" ; then\n", fp);
      fputs("		echo Unable to determine location of startup scripts!\n", fp);
      fputs("	else\n", fp);
      for (; i > 0; i --, file ++)
	if (tolower(file->type) == 'i' && file->subpackage == subpackage)
	{
	  qprintf(fp, "		%s/init.d/%s stop\n", SoftwareDir, file->dst);

	  fputs("		if test -d $rcdir/init.d; then\n", fp);
	  qprintf(fp, "			/bin/rm -f $rcdir/init.d/%s\n", file->dst);
	  fputs("		else\n", fp);
	  fputs("			if test -d /etc/init.d; then\n", fp);
	  qprintf(fp, "				/bin/rm -f /etc/init.d/%s\n", file->dst);
	  fputs("			fi\n", fp);
	  fputs("		fi\n", fp);

	  for (runlevels = get_runlevels(dist->files + i, "0123456");
	       isdigit(*runlevels & 255);
	       runlevels ++)
	  {
	    if (*runlevels == '0')
	      number = get_stop(file, 0);
	    else
	      number = get_start(file, 99);

	    qprintf(fp, "		/bin/rm -f $rcdir/rc%c.d/%c%02d%s\n", *runlevels,
		    (*runlevels == '0' || *runlevels == '1' ||
		     *runlevels == '6') ? 'K' : 'S', number, file->dst);
	  }
	}

      fputs("	fi\n", fp);
    }

    fputs("fi\n", fp);
  }
  else
    have_commands = 0;

  for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++)
    if (c->type == COMMAND_PRE_REMOVE && c->subpackage == subpackage)
      break;

  if (i > 0)
  {
    if (!have_commands)
      fprintf(fp, "%%preun%s\n", name);

    for (; i > 0; i --, c ++)
      if (c->type == COMMAND_PRE_REMOVE && c->subpackage == subpackage)
	fprintf(fp, "%s\n", c->command);
  }

  for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++)
    if (c->type == COMMAND_POST_REMOVE && c->subpackage == subpackage)
      break;

  if (i > 0)
  {
    fprintf(fp, "%%postun%s\n", name);
    for (; i > 0; i --, c ++)
      if (c->type == COMMAND_POST_REMOVE && c->subpackage == subpackage)
	fprintf(fp, "%s\n", c->command);
  }

 /*
  * Description...
  */

  for (i = 0; i < dist->num_descriptions; i ++)
    if (dist->descriptions[i].subpackage == subpackage)
      break;

  if (i < dist->num_descriptions)
  {
    fprintf(fp, "%%description %s\n", name);

    for (; i < dist->num_descriptions; i ++)
      if (dist->descriptions[i].subpackage == subpackage)
	fprintf(fp, "%s\n", dist->descriptions[i].description);
  }

 /*
  * Files...
  */

  fprintf(fp, "%%files%s\n", name);
  for (i = dist->num_files, file = dist->files; i > 0; i --, file ++)
    if (file->subpackage == subpackage)
      switch (tolower(file->type))
      {
	case 'c' :
            fprintf(fp, "%%attr(%04o,%s,%s) %%config(noreplace) \"%s\"\n",
	            file->mode, file->user, file->group, file->dst);
            break;
	case 'd' :
            fprintf(fp, "%%attr(%04o,%s,%s) %%dir \"%s\"\n", file->mode,
	            file->user, file->group, file->dst);
            break;
	case 'f' :
	case 'l' :
            fprintf(fp, "%%attr(%04o,%s,%s) \"%s\"\n", file->mode, file->user,
	            file->group, file->dst);
            break;
	case 'i' :
	    if (format == PACKAGE_LSB)
	      fprintf(fp, "%%attr(0555,root,root) \"/etc/init.d/%s\"\n",
		      file->dst);
            else
	      fprintf(fp, "%%attr(0555,root,root) \"%s/init.d/%s\"\n",
	              SoftwareDir, file->dst);
            break;
      }

  return (0);
}
Esempio n. 6
0
Haplotype* generate_haplotype(Region& str_region, int32_t max_ref_flank_len, std::string& chrom_seq,
			      std::vector< std::vector<Alignment> >& alignments, std::vector<std::string>& vcf_alleles,
			      StutterModel* stutter_model, bool search_bams_for_alleles,
			      std::vector<HapBlock*>& blocks, std::vector<bool>& call_sample, std::ostream& logger){
  assert(blocks.size() == 0);
  assert(call_sample.size() == 0);

  std::map<std::string, int> seqs;

  // Determine the minimum and maximum alignment boundaries
  int32_t min_start = INT_MAX, max_stop = INT_MIN;
  for (auto vec_iter = alignments.begin(); vec_iter != alignments.end(); vec_iter++){
    for (auto aln_iter = vec_iter->begin(); aln_iter != vec_iter->end(); aln_iter++){
      min_start = std::min(min_start, aln_iter->get_start());
      max_stop  = std::max(max_stop,  aln_iter->get_stop());
      seqs[aln_iter->get_sequence()]++;
    }
  }
  
  logger << "# Seqs = " << seqs.size() << std::endl;
			 
  // Extract candidate STR sequences (use some padding to ensure indels near STR ends are included)
  std::vector<std::string> str_seqs;
  int32_t left_padding = 5, right_padding = 5;
  int32_t rep_region_start = str_region.start() < left_padding ? 0 : str_region.start()-left_padding;
  int32_t rep_region_end   = str_region.stop() + right_padding;
  std::string ref_seq      = uppercase(chrom_seq.substr(rep_region_start, rep_region_end-rep_region_start));
  int ideal_min_length     = 3*str_region.period(); // Would ideally have at least 3 repeat units in each allele after trimming

  // TO DO: Use frequency of deletions not contained within window to 
  //   i) Identify problematic regions
  //  ii) Retry with increased window padding?
  int32_t min_del_start, max_del_stop, flank_del_start, flank_del_stop, min_ins_pos, max_ins_pos;
  std::vector<bool> flank_del_call_sample, flank_ins_call_sample;
  int num_ext_del   = check_deletion_bounds(alignments,     rep_region_start, rep_region_end, min_del_start,   max_del_stop,   call_sample);
  int num_flank_del = check_flanking_deletions(alignments,  rep_region_start, rep_region_end, flank_del_start, flank_del_stop, flank_del_call_sample);
  int num_flank_ins = check_flanking_insertions(alignments, rep_region_start, rep_region_end, min_ins_pos,     max_ins_pos,    flank_ins_call_sample);
  int nfail         = std::max(num_ext_del, std::max(num_flank_del, num_flank_ins));

  // Recheck deletions after expanding the STR window
  if(1.0*nfail/alignments.size() <= MAX_FRAC_SAMPLE_DEL_FAIL){
    logger << "PASS SAMPLE DEL STATS: " << rep_region_start << "\t" << rep_region_end << "\t" << num_ext_del
	    << "\t" << min_del_start << "\t" << max_del_stop << "\t" << std::endl;
  }
  else {
    logger << "FAIL SAMPLE DEL STATS: " << rep_region_start << "\t" << rep_region_end << "\t" << num_ext_del
	   << "\t" << min_del_start << "\t" << max_del_stop << "\t" << std::endl;

    int32_t min_s = std::min(min_del_start, std::min(flank_del_start, min_ins_pos));
    int32_t max_e = std::max(max_del_stop,  std::max(flank_del_stop,  max_ins_pos));

    call_sample.clear();
    flank_del_call_sample.clear();
    flank_ins_call_sample.clear();
    rep_region_start  = std::min(rep_region_start, std::max(rep_region_start-10, min_s-5));
    rep_region_end    = std::max(rep_region_end,   std::min(rep_region_end+10,   max_e+5));
    left_padding      = str_region.start() - rep_region_start;
    right_padding     = rep_region_end     - str_region.stop();
    ref_seq           = uppercase(chrom_seq.substr(rep_region_start, rep_region_end-rep_region_start));
    num_ext_del       = check_deletion_bounds(alignments,    rep_region_start,  rep_region_end, min_del_start, max_del_stop, call_sample);
    num_flank_del     = check_flanking_deletions(alignments,  rep_region_start, rep_region_end, flank_del_start, flank_del_stop, flank_del_call_sample);
    num_flank_ins     = check_flanking_insertions(alignments, rep_region_start, rep_region_end, min_ins_pos, max_ins_pos, flank_ins_call_sample);
    
      /*
      if(1.0*sample_fail_count/alignments.size() <= MAX_FRAC_SAMPLE_DEL_FAIL){
	logger << "REDONE_PASS SAMPLE DEL STATS: " << rep_region_start << "\t" << rep_region_end << "\t" << sample_fail_count
		  << "\t" << min_del_start << "\t" << max_del_stop << "\t" << std::endl;
      }
      else {
	logger << "REDONE_FAIL SAMPLE DEL STATS: " << rep_region_start << "\t" << rep_region_end << "\t" << sample_fail_count
		  << "\t" << min_del_start << "\t" << max_del_stop << "\t" << std::endl;
      }
      */
  }

  /*
  logger << "# Flank deletions = " << num_flank_del << ", # Flank insertions = " << num_flank_ins << std::endl;
  for (unsigned int i = 0; i < call_sample.size(); i++)
    call_sample[i] = call_sample[i] && flank_del_call_sample[i] && flank_ins_call_sample[i];
  */

  // Trim boundaries so that the reference flanks aren't too long
  if (rep_region_start > max_ref_flank_len)
    min_start = std::max(rep_region_start-max_ref_flank_len, min_start);
  max_stop = std::min(rep_region_end+max_ref_flank_len, max_stop);

  // Extend each VCF allele by padding size
  std::vector<std::string> ext_vcf_alleles;
  if (vcf_alleles.size() != 0){
    std::string lflank = uppercase(chrom_seq.substr(rep_region_start,  str_region.start()-rep_region_start));
    std::string rflank = uppercase(chrom_seq.substr(str_region.stop(), rep_region_end-str_region.stop())); 
    for (unsigned int i = 0; i < vcf_alleles.size(); i++){
      ext_vcf_alleles.push_back(lflank + vcf_alleles[i] + rflank);
      logger << ext_vcf_alleles.back() << std::endl;
    }
    logger << ext_vcf_alleles[0] << std::endl << ref_seq << std::endl;
    assert(ext_vcf_alleles[0].compare(ref_seq) == 0);
  }
  generate_candidate_str_seqs(ref_seq, chrom_seq, left_padding, right_padding, ideal_min_length, alignments, 
			      ext_vcf_alleles, search_bams_for_alleles, rep_region_start, rep_region_end, str_seqs, logger);
  
  // Create a set of haplotype regions, consisting of STR sequence block flanked by two reference sequence stretches
  assert(rep_region_start > min_start && rep_region_end < max_stop);
  assert(str_seqs[0].compare(uppercase(chrom_seq.substr(rep_region_start, rep_region_end-rep_region_start))) == 0);
  blocks.clear();
  blocks.push_back(new HapBlock(min_start, rep_region_start, uppercase(chrom_seq.substr(min_start, rep_region_start-min_start))));    // Ref sequence preceding STRS
  blocks.push_back(new RepeatBlock(rep_region_start, rep_region_end, 
				   uppercase(chrom_seq.substr(rep_region_start, rep_region_end-rep_region_start)), str_region.period(), stutter_model));
  blocks.push_back(new HapBlock(rep_region_end, max_stop, uppercase(chrom_seq.substr(rep_region_end, max_stop-rep_region_end))));  // Ref sequence following STRs
  for (unsigned int j = 1; j < str_seqs.size(); j++)
    blocks[1]->add_alternate(str_seqs[j]);

  // Initialize each block's data structures, namely the homopolymer length information
  for (unsigned int i = 0; i < blocks.size(); i++)
    blocks[i]->initialize();
 
  logger << "Constructing haplotype" << std::endl;
  Haplotype* haplotype = new Haplotype(blocks);
  haplotype->print_block_structure(30, 100, logger);
  return haplotype;
}