Esempio n. 1
0
/*
 *===========================================================================
 *                    ipcom_cmd_ipd
 *===========================================================================
 * Description:
 * Parameters:
 * Returns:
 */
IP_PUBLIC int
ipcom_cmd_ipd(int argc, char **argv)
{
    Ipcom_getopt   opt;
    int            i, c, msgtype;
    Ip_err         err = IPCOM_SUCCESS;
#if IPCOM_VR_MAX > 1
    int            vr = ipcom_proc_vr_get();
    int            vr_new = vr;
#endif

    if (argc < 2)
    {
usage:
        ipcom_fprintf(ip_stderr,
                      "Interpeak daemon (IPD) command, version 1.2"IP_LF
                      "usage:  "IP_LF
                      "   ipd [-V <vr>] list"IP_LF
                      "   ipd [-V <vr>] start <service>"IP_LF
                      "   ipd [-V <vr>] kill <service>"IP_LF
                      "   ipd [-V <vr>] reconfigure <service>"IP_LF
                      "   ipd [-V <vr>] <#> <service>"IP_LF
                      IP_LF);
        return 0;
    }

    ipcom_getopt_clear_r(&opt);
    while ((c = ipcom_getopt_r(argc, argv, "V:", &opt)) != -1)
    {
        switch(c)
        {
        case 'V':
#if IPCOM_VR_MAX > 1
            vr_new = ipcom_atoi(opt.optarg);
#endif
            break;
        default:
            ipcom_printf("ipd: unknown option %c"IP_LF, (char)c);
            return -1;
        }
    }

    if (opt.optind >= argc)
    {
        ipcom_printf("ipd: missing <command> argument"IP_LF);
        goto usage;
    }


    if(ipcom_strcmp(argv[opt.optind], "list") == 0)
    {
#if IPCOM_VR_MAX > 1
        if (vr != vr_new)
            ipcom_proc_vr_set(vr_new);
#endif
        ipcom_printf("Services:"IP_LF);
        for (i = 0; ipcom_ipd_products[i].name != IP_NULL; i++)
        {
            if ((argc - (opt.optind + 1)) > 0)
            {
                int p;
                for (p = opt.optind + 1; p < argc; p++)
                {
                    if (ipcom_strcasecmp(ipcom_ipd_products[i].name, argv[p]) == 0)
                        goto print_service;
                }
                continue;
            }

print_service:
            if (IP_BIT_ISSET(ipcom_ipd_products[i].flags, IPCOM_IPD_FLAG_IPD_START))
            {
#ifdef IP_PORT_OSE5
                if (ipcom_ipd_products[i].start == IP_NULL
                    && ipcom_ipd_isinstalled_ose5(ipcom_ipd_products[i].name) != IPCOM_SUCCESS)
                    continue;
#endif
                err = ipcom_ipd_send(ipcom_ipd_products[i].name, IPCOM_IPD_MSGTYPE_PING);
                ipcom_printf("%-20s %-s"IP_LF,
                             ipcom_ipd_products[i].name,
                             err == IPCOM_SUCCESS ? "started" : "killed");
            }
            else if (ipcom_ipd_products[i].start)
                ipcom_printf("%-20s %-s"IP_LF,
                             ipcom_ipd_products[i].name, "started");

        }
        ipcom_printf(IP_LF);
#if IPCOM_VR_MAX > 1
        if (vr != vr_new)
            ipcom_proc_vr_set(vr);
#endif
        return 0;
    }

    if ((argc - opt.optind) < 2)
    {
        ipcom_printf("ipd: missing <service> argument"IP_LF);
        return -1;
    }

    for (i = 0; ipcom_cmd_ipd_messages[i].name; i++)
        if (ipcom_strcmp(argv[opt.optind], ipcom_cmd_ipd_messages[i].name) == 0)
        {
            msgtype = ipcom_cmd_ipd_messages[i].msgtype;
            goto sendmsg;
        }

    if (*argv[opt.optind] == '-' && ipcom_isdigit(argv[opt.optind][1]))
    {
        /* "UNIX" signal support (using negative numbers) */
        msgtype = -ipcom_atoi(argv[opt.optind] + 1);
        goto sendmsg;
    }

    if (ipcom_isdigit(argv[opt.optind][0]))
    {
        /* positive numbers */
        msgtype = ipcom_atoi(argv[1]);
        goto sendmsg;
    }

    /* unknown command. */
    ipcom_printf ("ipd: unknown command '%s'"IP_LF, argv[opt.optind]);
    return -1;

    /* send msg */
 sendmsg:
#if IPCOM_VR_MAX > 1
    if (vr != vr_new)
        ipcom_proc_vr_set(vr_new);
#endif


    if ((argc - opt.optind) < 3)
        err = ipcom_ipd_send(argv[opt.optind+1], msgtype);
    else
    {
        Ipcom_ipd_msg   *msg;
        int             sz  = ipcom_strlen(argv[opt.optind + 2]) + 1;

        msg = ipcom_calloc(1, sz + sizeof(*msg));
        if (msg != IP_NULL)
        {
            msg->msgtype = msgtype;
            ipcom_memcpy(msg + 1, argv[opt.optind + 2], sz);
            err = ipcom_ipd_sendmsg(argv[opt.optind+1], msg, sz + sizeof(*msg));
            ipcom_free(msg);
        }
    }

    if(err == IPCOM_SUCCESS)
        ipcom_printf("ipd: %s %s ok"IP_LF, argv[opt.optind], argv[opt.optind+1]);
    else
        ipcom_printf("ipd: %s %s failed: %s"IP_LF, argv[opt.optind], argv[opt.optind+1], ipcom_err_string(err));

#if IPCOM_VR_MAX > 1
    if (vr != vr_new)
        ipcom_proc_vr_set(vr);
#endif
    return 0;
}
IP_PUBLIC unsigned long
ipcom_strtoul(const char *nptr, char **endptr, int base)
{
    const char   *s = nptr;
    unsigned long cutoff;
    unsigned long acc;
    int           neg = 0;
    int           cutlim;
    int           any;
    int           c;

    /*
     * See strtol for comments as to the logic used.
     */
    do
    {
        c = *s++;
    }
    while (ipcom_isspace (c));

    if (c == '-')
    {
        neg = 1;
        c = *s++;
    }
    else if (c == '+')
    {
        c = *s++;
    }
    
    if (((base == 0) || (base == 16)) &&
        (c == '0') &&
        ((*s == 'x') || (*s == 'X')))
    {
        c = s[1];
        s += 2;
        base = 16;
    }

    if (base == 0)
    {
        base = (c == '0' ? 8 : 10);
    }
    
    cutoff = (unsigned long)IPCOM_ULONG_MAX / (unsigned long)base;
    cutlim = (unsigned long)IPCOM_ULONG_MAX % (unsigned long)base;

    for (acc = 0, any = 0;; c = *s++)
    {
        if (ipcom_isdigit (c))
        {
            c -= '0';
        }
        else if (ipcom_isalpha (c))
        {
            c -= (ipcom_isupper (c) ? 'A' - 10 : 'a' - 10);
        }
        else
        {
            break;
        }
        
        if (c >= base)
        {
            break;
        }
        
        if ((any < 0) || (acc > cutoff) || ((acc == cutoff) && (c > cutlim)))
        {
            any = -1;
        }
        else
        {
            any = 1;
            acc *= base;
            acc += c;
        }
    }

    if (any < 0)
    {
        acc = IPCOM_ULONG_MAX;
    }
    else if (neg)
    {
        acc = -acc;
    }
    
    if (endptr != 0)
    {
        *endptr = (char *)(any ? (s - 1) : nptr);
    }
    
    return acc;
}
IP_PUBLIC long
ipcom_strtol(const char *nptr, char **endptr, int base)
{
    const char   *s = nptr;
    unsigned long cutoff;
    unsigned long acc;
    int           neg = 0;
    int           cutlim;
    int           any;
    int           c;

    /*
     * Skip white space and pick up leading +/- sign if any.
     * If base is 0, allow 0x for hex and 0 for octal, else
     * assume decimal; if base is already 16, allow 0x.
     */
    do
    {
        c = *s++;
    }
    while (ipcom_isspace (c));

    if (c == '-')
    {
        neg = 1;
        c = *s++;
    }
    else if (c == '+')
    {
        c = *s++;
    }
    
    if (((base == 0) || (base == 16)) &&
        (c == '0') &&
        ((*s == 'x') || (*s == 'X')))
    {
        c = s[1];
        s += 2;
        base = 16;
    }

    if (base == 0)
    {
        base = (c == '0' ? 8 : 10);
    }
    
    /*
     * Compute the cutoff value between legal numbers and illegal
     * numbers.  That is the largest legal value, divided by the
     * base.  An input number that is greater than this value, if
     * followed by a legal input character, is too big.  One that
     * is equal to this value may be valid or not; the limit
     * between valid and invalid numbers is then based on the last
     * digit.  For instance, if the range for longs is
     * [-2147483648..2147483647] and the input base is 10,
     * cutoff will be set to 214748364 and cutlim to either
     * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated
     * a value > 214748364, or equal but the next digit is > 7 (or 8),
     * the number is too big, and we will return a range error.
     *
     * Set any if any `digits' consumed; make it negative to indicate
     * overflow.
     */

    cutoff = (neg ? -(unsigned long)IPCOM_LONG_MIN : IPCOM_LONG_MAX);
    cutlim = cutoff % (unsigned long)base;
    cutoff /= (unsigned long)base;

    for (acc = 0, any = 0;; c = *s++)
    {
        if (ipcom_isdigit (c))
        {
            c -= '0';
        }
        else if (ipcom_isalpha (c))
        {
            c -= (ipcom_isupper(c) ? 'A' - 10 : 'a' - 10);
        }
        else
        {
            break;
        }
        
        if (c >= base)
        {
            break;
        }
        
        if ((any < 0) || (acc > cutoff) || ((acc == cutoff) && (c > cutlim)))
        {
            any = -1;
        }
        else
        {
            any = 1;
            acc *= base;
            acc += c;
        }
    }

    if (any < 0)
    {
        acc = (neg ? IPCOM_LONG_MIN : IPCOM_LONG_MAX);
    }
    else if (neg)
    {
        acc = -acc;
    }
    
    if (endptr != 0)
    {
        *endptr = (char *)(any ? (s - 1) : nptr);
    }
    
    return acc;
}
Esempio n. 4
0
/*
 *===========================================================================
 *                    ipcom_shellalias_substitute
 *===========================================================================
 * Description: Determines what substitutins should be made
 * Parameters:  argc    - Old argc
 *              argv    - Old argv
 *              alias   - The alias we're working with
 *              nargv   - The new alias argv string
 * Returns:     >= 0 The total number of arguments, < 0 error code
 *
 */
IP_STATIC int
ipcom_shellalias_substitute(int                             argc,
                            char                            **argv,
                            struct Ipcom_shellalias_alias   *alias,
                            char                            **nargv)
{
    int                             nargc   = 0;
    int                             i;
    Ip_bool                         subst   = IP_FALSE;

    /* Do hunt for substitutions */
    for (i = 0; i < alias->argc; i++)
    {
        char            *ptr = alias->argv[i];
        long            start;
        long            end;
        Ip_bool         wildcard = IP_FALSE;

        /* Substitution? */
        if (*ptr++ == '!')
        {
            /* See what kind of substitution we're dealing with */
            switch (*ptr)
            {
            case '\0':
                /* Just a simple '!' */
                break;
            case '^':
                start = 1;
                ptr++;
                goto parse_range;
            case '$':
                start   = argc - 1;
                end     = argc - 1;
                goto substitute_range;
            case '*':
                wildcard = IP_TRUE;
                start   = 1;
                end     = argc - 1;
                goto substitute_range;
            case '-':
                /* This is a -number subtitution, which indicates 0 - num substitution. */
                start = 0;
                goto parse_range;
            default:
                if (ipcom_isdigit(*ptr))
                {
                    /* Resolve */
                    start = ipcom_strtol(ptr, &ptr, 10);

parse_range:
                    /* Is it a range or a single value? */
                    if (*ptr == '-')
                    {
                        ptr++;

                        /* It's a range */
                        if (*ptr == '\0')
                            end = argc - 2;
                        else if (*ptr == '$')
                            end = argc - 1;
                        else if (ipcom_isdigit(*ptr))
                        {
                            /* Resolve */
                            end = ipcom_strtol(ptr, &ptr, 10);
                        }
                        else
                        {
                            ipcom_printf("alias: [%s] !x- - substitution requested, but argument following '-' is erronous"IP_LF,
                                         alias->name);
                            return -IPCOM_ERR_INVALID_ARG;
                        }
                    }
                    else if (*ptr == '*')
                    {
                        wildcard = IP_TRUE;
                        end = argc - 1;
                    }
                    else
                        end = start;

substitute_range:
                    /* OK */
                    subst = IP_TRUE;

                    /* Verify if we've gotten the required arguments */
                    if (start < 0 || start >= argc)
                    {
                        /* We've gotten a wildcard match, but we aint got the arguments. Continue */
                        if (wildcard)
                            continue;

                        ipcom_printf("alias: [%s] !x - substitution requested, but insufficient arguments supplied"IP_LF,
                                     alias->name);
                        return -IPCOM_ERR_INVALID_ARG;
                    }

                    /* Verify that we have the required number of arguments */
                    if (end >= argc)
                    {
                        ipcom_printf("alias: [%s] !x-y - substitution requested, but insufficient arguments supplied"IP_LF,
                                     alias->name);
                        return -IPCOM_ERR_INVALID_ARG;
                    }

                    /* Sanity that start <= end */
                    if (end < start)
                    {
                        ipcom_printf("alias: [%s] !x-y - substitution requested, but x > y"IP_LF,
                                     alias->name);
                        return -IPCOM_ERR_INVALID_ARG;
                    }


                    /* Go through the arugments */
                    for (; start <= end; start++)
                    {
                        if (nargv != IP_NULL)
                            nargv[nargc] = argv[start];

                        nargc++;
                    }

                    continue;
                }
            }
        }

        if (nargv != IP_NULL)
            nargv[nargc] = alias->argv[i];
        nargc++;
    }

    /* No substitutions? */
    if (subst == IP_FALSE)
    {
        /* Add all arguments to the end of the command */
        for (i = 1; i < argc; i++)
        {
            if (nargv != IP_NULL)
                nargv[nargc] = argv[i];

            nargc++;
        }
    }


    /* Return the number of arguments */
    return nargc;
}