~ubuntu-branches/ubuntu/precise/kompozer/precise

« back to all changes in this revision

Viewing changes to mozilla/nsprpub/pr/tests/parent.c

  • Committer: Bazaar Package Importer
  • Author(s): Anthony Yarusso
  • Date: 2007-08-27 01:11:03 UTC
  • Revision ID: james.westby@ubuntu.com-20070827011103-2jgf4s6532gqu2ka
Tags: upstream-0.7.10
ImportĀ upstreamĀ versionĀ 0.7.10

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 
2
/* 
 
3
 * The contents of this file are subject to the Mozilla Public
 
4
 * License Version 1.1 (the "License"); you may not use this file
 
5
 * except in compliance with the License. You may obtain a copy of
 
6
 * the License at http://www.mozilla.org/MPL/
 
7
 * 
 
8
 * Software distributed under the License is distributed on an "AS
 
9
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 
10
 * implied. See the License for the specific language governing
 
11
 * rights and limitations under the License.
 
12
 * 
 
13
 * The Original Code is the Netscape Portable Runtime (NSPR).
 
14
 * 
 
15
 * The Initial Developer of the Original Code is Netscape
 
16
 * Communications Corporation.  Portions created by Netscape are 
 
17
 * Copyright (C) 1998-2000 Netscape Communications Corporation.  All
 
18
 * Rights Reserved.
 
19
 * 
 
20
 * Contributor(s):
 
21
 * 
 
22
 * Alternatively, the contents of this file may be used under the
 
23
 * terms of the GNU General Public License Version 2 or later (the
 
24
 * "GPL"), in which case the provisions of the GPL are applicable 
 
25
 * instead of those above.  If you wish to allow use of your 
 
26
 * version of this file only under the terms of the GPL and not to
 
27
 * allow others to use your version of this file under the MPL,
 
28
 * indicate your decision by deleting the provisions above and
 
29
 * replace them with the notice and other provisions required by
 
30
 * the GPL.  If you do not delete the provisions above, a recipient
 
31
 * may use your version of this file under either the MPL or the
 
32
 * GPL.
 
33
 */
 
34
 
 
35
/*
 
36
** file:        parent.c
 
37
** description: test the process machinery
 
38
*/
 
39
 
 
40
#include "prmem.h"
 
41
#include "prprf.h"
 
42
#include "prinit.h"
 
43
#include "prproces.h"
 
44
#include "prinrval.h"
 
45
 
 
46
typedef struct Child
 
47
{
 
48
    const char *name;
 
49
    char **argv;
 
50
    PRProcess *process;
 
51
    PRProcessAttr *attr;
 
52
} Child;
 
53
 
 
54
/* for the default test 'cvar -c 2000' */
 
55
static char *default_argv[] = {"cvar", "-c", "2000", NULL};
 
56
 
 
57
static void PrintUsage(void)
 
58
{
 
59
    PR_fprintf(PR_GetSpecialFD(PR_StandardError),
 
60
        "Usage: parent [-d] child [options]\n");
 
61
}
 
62
 
 
63
PRIntn main (PRIntn argc, char **argv)
 
64
{
 
65
    PRStatus rv;
 
66
    PRInt32 test_status = 1;
 
67
    PRIntervalTime t_start, t_elapsed;
 
68
    PRFileDesc *debug = NULL;
 
69
    Child *child = PR_NEWZAP(Child);
 
70
 
 
71
    if (1 == argc)
 
72
    {
 
73
        /* no command-line arguments: run the default test */
 
74
        child->argv = default_argv;
 
75
    }
 
76
    else
 
77
    {
 
78
        argv += 1;  /* don't care about our program name */
 
79
        while (*argv != NULL && argv[0][0] == '-')
 
80
        {
 
81
            if (argv[0][1] == 'd')
 
82
                debug = PR_GetSpecialFD(PR_StandardError);
 
83
            else
 
84
            {
 
85
                PrintUsage();
 
86
                return 2;  /* not sufficient */
 
87
            }
 
88
            argv += 1;
 
89
        }
 
90
        child->argv = argv;
 
91
    }
 
92
 
 
93
    if (NULL == *child->argv)
 
94
    {
 
95
        PrintUsage();
 
96
        return 2;
 
97
    }
 
98
 
 
99
    child->name = *child->argv;
 
100
    if (NULL != debug) PR_fprintf(debug, "Forking %s\n", child->name);
 
101
 
 
102
    child->attr = PR_NewProcessAttr();
 
103
    PR_ProcessAttrSetStdioRedirect(
 
104
        child->attr, PR_StandardOutput,
 
105
        PR_GetSpecialFD(PR_StandardOutput));
 
106
    PR_ProcessAttrSetStdioRedirect(
 
107
        child->attr, PR_StandardError,
 
108
        PR_GetSpecialFD(PR_StandardError));
 
109
 
 
110
    t_start = PR_IntervalNow();
 
111
    child->process = PR_CreateProcess(
 
112
        child->name, child->argv, NULL, child->attr);
 
113
    t_elapsed = (PRIntervalTime) (PR_IntervalNow() - t_start);
 
114
 
 
115
    PR_DestroyProcessAttr(child->attr);
 
116
 
 
117
    test_status = (NULL == child->process) ? 1 : 0;
 
118
    if (NULL != debug)
 
119
    {
 
120
        PR_fprintf(
 
121
            debug, "Child was %sforked\n",
 
122
            (0 == test_status) ? "" : "NOT ");
 
123
        if (0 == test_status)
 
124
            PR_fprintf(
 
125
                debug, "PR_CreateProcess took %lu microseconds\n",
 
126
                PR_IntervalToMicroseconds(t_elapsed));
 
127
    }
 
128
 
 
129
    if (0 == test_status)
 
130
    {
 
131
        if (NULL != debug) PR_fprintf(debug, "Waiting for child to exit\n");
 
132
        rv = PR_WaitProcess(child->process, &test_status);
 
133
        if (PR_SUCCESS == rv)
 
134
        {
 
135
            if (NULL != debug)
 
136
                PR_fprintf(
 
137
                    debug, "Child exited %s\n",
 
138
                    (0 == test_status) ? "successfully" : "with error");
 
139
        }
 
140
        else
 
141
        {
 
142
            test_status = 1;
 
143
            if (NULL != debug)
 
144
                PR_fprintf(debug, "PR_WaitProcess failed\n");
 
145
        }
 
146
    }
 
147
    PR_DELETE(child);
 
148
    PR_Cleanup();
 
149
    return test_status;
 
150
    
 
151
}  /* main */
 
152
 
 
153
/* parent.c */
 
154