Пример #1
0
static FcBool
interpret_builtin (FcFormatContext *c,
		   FcPattern       *pat,
		   FcStrBuf        *buf)
{
    FcChar8       *new_str = NULL;
    FcBool         ret;

    if (!expect_char (c, '=') ||
	!read_word (c))
	return FcFalse;

    /* try simple builtins first */
    if (0) { }
#define BUILTIN(name, func) \
    else if (0 == strcmp ((const char *) c->word, name))\
	do { new_str = func (pat); ret = FcTrue; } while (0)
    BUILTIN ("unparse",  FcNameUnparse);
 /* BUILTIN ("verbose",  FcPatternPrint); XXX */
#undef BUILTIN
    else
Пример #2
0
static struct buffer parse_table(struct buffer buff,
      struct invocation *invocation, const char **error)
{
   unsigned i;
   size_t ident_len;
   struct argument args[QUERY_MAX_ARGS];
   const char *ident_name = NULL;
   unsigned argi = 0;

   buff = chomp(buff);
   buff = expect_char(buff, '{', error);

   if (*error)
      goto clean;

   buff = chomp(buff);

   while (!peek(buff, "}"))
   {
      if (argi >= QUERY_MAX_ARGS)
      {
         raise_too_many_arguments(error);
         goto clean;
      }

      if (isalpha((int)buff.data[buff.offset]))
      {
         buff = get_ident(buff, &ident_name, &ident_len, error);

         if (!*error)
         {
            args[argi].a.value.type = RDT_STRING;
            args[argi].a.value.val.string.len = ident_len;
            args[argi].a.value.val.string.buff = (char*)calloc(
                  ident_len + 1,
                  sizeof(char)
                  );

            if (!args[argi].a.value.val.string.buff)
               goto clean;

            strncpy(
                  args[argi].a.value.val.string.buff,
                  ident_name,
                  ident_len
                  );
         }
      }
      else
         buff = parse_string(buff, &args[argi].a.value, error);

      if (*error)
         goto clean;

      args[argi].type = AT_VALUE;
      buff = chomp(buff);
      argi++;
      buff = expect_char(buff, ':', error);

      if (*error)
         goto clean;

      buff = chomp(buff);

      if (argi >= QUERY_MAX_ARGS)
      {
         raise_too_many_arguments(error);
         goto clean;
      }

      buff = parse_argument(buff, &args[argi], error);

      if (*error)
         goto clean;
      argi++;
      buff = chomp(buff);
      buff = expect_char(buff, ',', error);

      if (*error)
      {
         *error = NULL;
         break;
      }
      buff = chomp(buff);
   }

   buff = expect_char(buff, '}', error);

   if (*error)
      goto clean;

   invocation->func = all_map;
   invocation->argc = argi;
   invocation->argv = (struct argument*)
      malloc(sizeof(struct argument) * argi);

   if (!invocation->argv)
   {
      raise_enomem(error);
      goto clean;
   }
   memcpy(invocation->argv, args,
         sizeof(struct argument) * argi);

   goto success;
clean:
   for (i = 0; i < argi; i++)
      argument_free(&args[i]);
success:
   return buff;
}
Пример #3
0
int main (int argc, char **argv)
{
    char * password = 0;
    char * username = 0;

    char expect = ':';

    int opt, pty, pid, rc;
    int times = 1;

    while((opt = getopt(argc,argv,"+hrp:u:")) != -1)
        switch(opt)
        {
            case 'h':
                printf("%s",myexpect_usage);
                exit(0);
                break;
            case 'p':
                password = strdup(optarg);
                break;
            case 'u':
                username = strdup(optarg);
                break;
            case 'r':
                times = 2;
                break;
            default:
                fprintf(stderr,"Wrong option. Check usage\n");
                fprintf(stderr,"%s",myexpect_usage);
                exit(-1);
                break;
        }

    if (password == 0 || username == 0 || optind >= argc )
    {
        fprintf(stderr,"Wrong number of arguments. Check usage\n");
        fprintf(stderr,"%s",myexpect_usage);
        exit(-1);
    }

    pid = forkpty(&pty,0,0,0);

    if(pid == 0)
    {
        struct termios tios;

        tcgetattr(pty, &tios);

        tios.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL);
        tios.c_oflag &= ~(ONLCR);

        tcsetattr(pty, TCSANOW, &tios);

        execvp(argv[optind],&(argv[optind]));

        exit(-1);
    }
    else if (pid == -1)
    {
       perror("fork\n");
    }

    while ( times > 0 )
    {
        if (expect_char(pty,&expect,1) == -1)
        {
            return -1;
        }

        sleep(1);

        write_answer(pty,username);

        if (expect_char(pty,&expect,1) == -1)
        {
            return -1;
        }

        sleep(1);

        write_answer(pty,password);

        times = times - 1;
    }

    expect_char(pty,0,0);

    wait(&rc);

    return WEXITSTATUS(rc);
}
Пример #4
0
static struct buffer parse_method_call(struct buffer buff,
      struct invocation *invocation, const char **error)
{
   size_t func_name_len;
   unsigned i;
   struct argument args[QUERY_MAX_ARGS];
   unsigned argi = 0;
   const char *func_name = NULL;
   struct registered_func *rf = registered_functions;

   invocation->func = NULL;

   buff = get_ident(buff, &func_name, &func_name_len, error);
   if (*error)
      goto clean;

   buff = chomp(buff);
   buff = expect_char(buff, '(', error);
   if (*error)
      goto clean;

   while (rf->name)
   {
      if (strncmp(rf->name, func_name, func_name_len) == 0)
      {
         invocation->func = rf->func;
         break;
      }
      rf++;
   }

   if (!invocation->func)
   {
      raise_unknown_function(buff.offset, func_name,
            func_name_len, error);
      goto clean;
   }

   buff = chomp(buff);
   while (!peek(buff, ")"))
   {
      if (argi >= QUERY_MAX_ARGS)
      {
         raise_too_many_arguments(error);
         goto clean;
      }

      buff = parse_argument(buff, &args[argi], error);

      if (*error)
         goto clean;

      argi++;
      buff = chomp(buff);
      buff = expect_char(buff, ',', error);

      if (*error)
      {
         *error = NULL;
         break;
      }
      buff = chomp(buff);
   }
   buff = expect_char(buff, ')', error);

   if (*error)
      goto clean;

   invocation->argc = argi;
   invocation->argv = (struct argument*)
      malloc(sizeof(struct argument) * argi);

   if (!invocation->argv)
   {
      raise_enomem(error);
      goto clean;
   }
   memcpy(invocation->argv, args,
         sizeof(struct argument) * argi);

   goto success;
clean:
   for (i = 0; i < argi; i++)
      argument_free(&args[i]);
success:
   return buff;
}