VirtualBox

Ignore:
Timestamp:
Jan 2, 2015 12:17:12 PM (10 years ago)
Author:
vboxsync
Message:

VBoxDTrace: Started on the dtrace command, calling ours VBoxDTrace. (r16)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/dtrace.c

    r53634 r53646  
    2525 */
    2626
     27#ifndef VBOX
    2728#pragma ident   "%Z%%M% %I%     %E% SMI"
     29#endif
    2830
    2931#include <sys/types.h>
    3032#include <sys/stat.h>
    31 #include <sys/wait.h>
     33#ifndef _MSC_VER
     34# include <sys/wait.h>
     35#endif
    3236
    3337#include <dtrace.h>
     
    3539#include <stdarg.h>
    3640#include <stdio.h>
    37 #include <strings.h>
    38 #include <unistd.h>
     41#ifndef VBOX
     42# include <strings.h>
     43#endif
     44#ifndef _MSC_VER
     45# include <unistd.h>
     46#else
     47# include <direct.h>
     48# include <io.h>
     49#endif
    3950#include <limits.h>
    4051#include <fcntl.h>
    4152#include <errno.h>
    4253#include <signal.h>
     54#ifndef VBOX
    4355#include <alloca.h>
    4456#include <libgen.h>
    4557#include <libproc.h>
     58#endif
     59
     60#ifdef VBOX
     61# include <stdio.h>
     62
     63# include <iprt/alloca.h>
     64# include <iprt/getopt.h>
     65# include <iprt/initterm.h>
     66# include <iprt/path.h>
     67# include <iprt/message.h>
     68# include <iprt/process.h>
     69# include <iprt/string.h>
     70
     71# undef PATH_MAX
     72# define PATH_MAX RTPATH_MAX
     73
     74# define getpid                                   RTProcSelf
     75# define strlcpy(a_pszDst, a_pszSrc, a_cbDst) RTStrCopy(a_pszDst, a_cbDst, a_pszSrc)
     76# define basename(a_pszPath)                  RTPathFilename(a_pszPath)
     77
     78# ifdef _MSC_VER
     79#  pragma warning(disable:4267) /* size_t conversion warnings */
     80#  pragma warning(disable:4018) /* signed/unsigned mismatch */
     81# endif
     82#endif
    4683
    4784typedef struct dtrace_cmd {
     
    66103#define E_USAGE         2
    67104
     105#ifndef VBOX
    68106static const char DTRACE_OPTSTR[] =
    69107        "3:6:aAb:Bc:CD:ef:FGhHi:I:lL:m:n:o:p:P:qs:SU:vVwx:X:Z";
     108#else
     109static const RTGETOPTDEF g_aOptions[] =
     110{
     111        { "-32", 10064, RTGETOPT_REQ_NOTHING },
     112        { "-64", 10032, RTGETOPT_REQ_NOTHING },
     113        { NULL, 'a',    RTGETOPT_REQ_NOTHING },
     114        { NULL, 'A',    RTGETOPT_REQ_NOTHING },
     115        { NULL, 'b',    RTGETOPT_REQ_STRING },
     116        { NULL, 'B',    RTGETOPT_REQ_NOTHING },
     117        { NULL, 'c',    RTGETOPT_REQ_STRING },
     118        { NULL, 'C',    RTGETOPT_REQ_NOTHING },
     119        { NULL, 'D',    RTGETOPT_REQ_STRING },
     120        { NULL, 'e',    RTGETOPT_REQ_NOTHING },
     121        { NULL, 'f',    RTGETOPT_REQ_STRING },
     122        { NULL, 'F',    RTGETOPT_REQ_NOTHING },
     123        { NULL, 'G',    RTGETOPT_REQ_NOTHING },
     124        { NULL, 'h',    RTGETOPT_REQ_NOTHING },
     125        { NULL, 'H',    RTGETOPT_REQ_NOTHING },
     126        { NULL, 'i',    RTGETOPT_REQ_STRING },
     127        { NULL, 'I',    RTGETOPT_REQ_STRING },
     128        { NULL, 'l',    RTGETOPT_REQ_NOTHING },
     129        { NULL, 'L',    RTGETOPT_REQ_STRING },
     130        { NULL, 'M',    RTGETOPT_REQ_STRING },
     131        { NULL, 'n',    RTGETOPT_REQ_STRING },
     132        { NULL, 'o',    RTGETOPT_REQ_STRING },
     133        { NULL, 'p',    RTGETOPT_REQ_STRING },
     134        { NULL, 'P',    RTGETOPT_REQ_STRING },
     135        { NULL, 'q',    RTGETOPT_REQ_NOTHING },
     136        { NULL, 's',    RTGETOPT_REQ_STRING },
     137        { NULL, 'S',    RTGETOPT_REQ_NOTHING },
     138        { NULL, 'U',    RTGETOPT_REQ_STRING },
     139        { NULL, 'v',    RTGETOPT_REQ_NOTHING },
     140        { NULL, 'V',    RTGETOPT_REQ_NOTHING },
     141        { NULL, 'w',    RTGETOPT_REQ_NOTHING },
     142        { NULL, 'x',    RTGETOPT_REQ_STRING },
     143        { NULL, 'X',    RTGETOPT_REQ_STRING },
     144        { NULL, 'Z',    RTGETOPT_REQ_NOTHING },
     145};
     146#endif /* VBOX */
     147
    70148
    71149static char **g_argv;
     
    93171static int g_grabanon = 0;
    94172static const char *g_ofile = NULL;
     173#ifndef _MSC_VER /* stdout isn't a constant usable in C code. */
    95174static FILE *g_ofp = stdout;
     175#else
     176static FILE *g_ofp = NULL;
     177#endif
    96178static dtrace_hdl_t *g_dtp;
    97179static char *g_etcfile = "/etc/system";
     
    437519        (void) close(fd);
    438520
     521#ifndef _MSC_VER
    439522        if (chown(tmpname, sbuf.st_uid, sbuf.st_gid) != 0) {
    440523                (void) unlink(tmpname);
     
    442525                    (int)sbuf.st_uid, (int)sbuf.st_gid);
    443526        }
     527#endif
    444528
    445529        if (rename(tmpname, fname) == -1)
     
    511595
    512596        for (i = 0; i < p->dtp_argc; i++) {
     597#ifndef VBOX /* no ctf for now  */
    513598                if (ctf_type_name(p->dtp_argv[i].dtt_ctfp,
    514599                    p->dtp_argv[i].dtt_type, buf, sizeof (buf)) == NULL)
     600#endif
    515601                        (void) strlcpy(buf, "(unknown)", sizeof (buf));
    516602                oprintf("\t\targs[%d]: %s\n", i, buf);
     
    742828prochandler(struct ps_prochandle *P, const char *msg, void *arg)
    743829{
     830#ifndef VBOX
    744831        const psinfo_t *prp = Ppsinfo(P);
    745832        int pid = Pstatus(P)->pr_pid;
     
    779866                break;
    780867        }
     868#endif /* !VBOX */
    781869}
    782870
     
    11551243{
    11561244        dtrace_bufdesc_t buf;
     1245#ifndef _MSC_VER
    11571246        struct sigaction act, oact;
     1247#endif
    11581248        dtrace_status_t status[2];
    11591249        dtrace_optval_t opt;
     
    11651255        struct ps_prochandle *P;
    11661256        pid_t pid;
    1167 
     1257#ifdef VBOX
     1258        RTGETOPTUNION ValueUnion;
     1259        RTGETOPTSTATE GetState;
     1260
     1261        err = RTR3InitExe(argc, &argv, RTR3INIT_FLAGS_SUPLIB);
     1262        if (RT_FAILURE(err))
     1263                return RTMsgInitFailure(err);
     1264#endif
     1265#ifdef _MSC_VER
     1266        g_ofp = stdout;
     1267#endif
    11681268        g_pname = basename(argv[0]);
    11691269
     
    11881288         * options into g_argv[], and abort if any invalid options are found.
    11891289         */
     1290#ifndef VBOX
    11901291        for (optind = 1; optind < argc; optind++) {
    11911292                while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != EOF) {
     1293#else
     1294        RTGetOptInit(&GetState, argc, argv, g_aOptions, RT_ELEMENTS(g_aOptions), 1, 0);
     1295        while ((c = RTGetOpt(&GetState, &ValueUnion))) {
     1296                {
     1297                        const char *optarg = ValueUnion.psz;
     1298#endif
    11921299                        switch (c) {
     1300#ifndef VBOX
    11931301                        case '3':
    11941302                                if (strcmp(optarg, "2") != 0) {
     
    11981306                                        return (usage(stderr));
    11991307                                }
     1308#else
     1309                        case 10032:
     1310#endif
    12001311                                g_oflags &= ~DTRACE_O_LP64;
    12011312                                g_oflags |= DTRACE_O_ILP32;
    12021313                                break;
    12031314
     1315#ifndef VBOX
    12041316                        case '6':
    12051317                                if (strcmp(optarg, "4") != 0) {
     
    12091321                                        return (usage(stderr));
    12101322                                }
     1323#else
     1324                        case 10064:
     1325#endif
    12111326                                g_oflags &= ~DTRACE_O_ILP32;
    12121327                                g_oflags |= DTRACE_O_LP64;
     
    12551370                                break;
    12561371
     1372#ifndef VBOX
    12571373                        default:
    12581374                                if (strchr(DTRACE_OPTSTR, c) == NULL)
    12591375                                        return (usage(stderr));
     1376#else
     1377                        case VINF_GETOPT_NOT_OPTION:
     1378                                g_argv[g_argc++] = (char *)ValueUnion.psz;
     1379                                break;
     1380
     1381                        default:
     1382                                if (c < 0) { /* Note: Not all options are handled. */
     1383                                        RTGetOptPrintError(c, &ValueUnion);
     1384                                        return (usage(stderr));
     1385                                }
     1386#endif
    12601387                        }
    12611388                }
    12621389
     1390#ifndef VBOX
    12631391                if (optind < argc)
    12641392                        g_argv[g_argc++] = argv[optind];
     1393#endif
    12651394        }
    12661395
     
    12741403                return (printf("%s: %s\n", g_pname, _dtrace_version) <= 0);
    12751404
     1405#ifndef VBOX
    12761406        /*
    12771407         * If we're in linker mode and the data model hasn't been specified,
     
    13231453                }
    13241454        }
     1455#endif /* !VBOX */
    13251456
    13261457        /*
     
    13711502         * this time; these will compiled as part of the fourth processing pass.
    13721503         */
     1504#ifndef VBOX
    13731505        for (optind = 1; optind < argc; optind++) {
    13741506                while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != EOF) {
     1507#else
     1508        RTGetOptInit(&GetState, argc, argv, g_aOptions, RT_ELEMENTS(g_aOptions), 1, 0);
     1509        while ((c = RTGetOpt(&GetState, &ValueUnion))) {
     1510                {
     1511                        char *optarg = (char *)ValueUnion.psz;
     1512#endif
     1513
    13751514                        switch (c) {
    13761515                        case 'a':
     
    15041643                                break;
    15051644
     1645#ifndef VBOX
    15061646                        default:
    15071647                                if (strchr(DTRACE_OPTSTR, c) == NULL)
    15081648                                        return (usage(stderr));
     1649#else
     1650                        default:
     1651                                if (c < 0) { /* Note: Not all options are handled. */
     1652                                        RTGetOptPrintError(c, &ValueUnion);
     1653                                        return (usage(stderr));
     1654                                }
     1655#endif
    15091656                        }
    15101657                }
     
    15281675         * may been affected by any library options set by the second pass.
    15291676         */
     1677#ifndef VBOX
    15301678        for (optind = 1; optind < argc; optind++) {
    15311679                while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != EOF) {
     1680#else
     1681        RTGetOptInit(&GetState, argc, argv, g_aOptions, RT_ELEMENTS(g_aOptions), 1, 0);
     1682        while ((c = RTGetOpt(&GetState, &ValueUnion))) {
     1683                {
     1684                        char *optarg = (char *)ValueUnion.psz;
     1685#endif
    15321686                        switch (c) {
    15331687                        case 'c':
     
    17711925                notice("allowing destructive actions\n");
    17721926
     1927#ifndef _MSC_VER
    17731928        (void) sigemptyset(&act.sa_mask);
    17741929        act.sa_flags = 0;
     
    17801935        if (sigaction(SIGTERM, NULL, &oact) == 0 && oact.sa_handler != SIG_IGN)
    17811936                (void) sigaction(SIGTERM, &act, NULL);
     1937#else
     1938        signal(SIGINT, intr);
     1939        signal(SIGTERM, intr);
     1940#endif
    17821941
    17831942        /*
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette