Changeset 3231
- Timestamp:
- Jun 30, 2010 5:29:59 AM (14 years ago)
- Location:
- pjproject/branches/projects/cli
- Files:
-
- 3 added
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/branches/projects/cli/pjlib-util/build/Makefile
r3211 r3231 28 28 export PJLIB_UTIL_SRCDIR = ../src/pjlib-util 29 29 export PJLIB_UTIL_OBJS += $(OS_OBJS) $(M_OBJS) $(CC_OBJS) $(HOST_OBJS) \ 30 base64.o cli.o cli_console.o c rc32.o errno.o dns.o \30 base64.o cli.o cli_console.o cli_telnet.o crc32.o errno.o dns.o \ 31 31 dns_dump.o dns_server.o getopt.o hmac_md5.o hmac_sha1.o \ 32 32 http_client.o md5.o pcap.o resolver.o scanner.o sha1.o \ -
pjproject/branches/projects/cli/pjlib-util/build/pjlib_util.vcproj
r3211 r3231 2778 2778 </File> 2779 2779 <File 2780 RelativePath="..\src\pjlib-util\cli_telnet.c" 2781 > 2782 </File> 2783 <File 2780 2784 RelativePath="..\src\pjlib-util\crc32.c" 2781 2785 > … … 4735 4739 </File> 4736 4740 <File 4741 RelativePath="..\include\pjlib-util\cli_telnet.h" 4742 > 4743 </File> 4744 <File 4737 4745 RelativePath="..\include\pjlib-util\config.h" 4738 4746 > -
pjproject/branches/projects/cli/pjlib-util/include/pjlib-util/cli.h
r3211 r3231 38 38 39 39 /** 40 * Maximum length of command buffer.41 */42 #ifndef PJ_CLI_MAX_CMDBUF43 # define PJ_CLI_MAX_CMDBUF 12044 #endif45 46 /**47 * Maximum command arguments.48 */49 #ifndef PJ_CLI_MAX_ARGS50 # define PJ_CLI_MAX_ARGS 851 #endif52 53 /**54 * Maximum short name version (shortcuts) for a command.55 */56 #ifndef PJ_CLI_MAX_SHORTCUTS57 # define PJ_CLI_MAX_SHORTCUTS 458 #endif59 60 /*61 * New error constants (note: to be placed in errno.h with new values)62 */63 /**64 * @hideinitializer65 * End the current session. This is a special error code returned by66 * pj_cli_exec() to indicate that "exit" or equivalent command has been67 * called to end the current session.68 */69 #define PJ_CLI_EEXIT -10170 /**71 * @hideinitializer72 * A required CLI argument is not specified.73 */74 #define PJ_CLI_EMISSINGARG -10475 /**76 * @hideinitializer77 * Too many CLI arguments.78 */79 #define PJ_CLI_ETOOMANYARGS -10580 /**81 * @hideinitializer82 * Invalid CLI argument. Typically this is caused by extra characters83 * specified in the command line which does not match any arguments.84 */85 #define PJ_CLI_EINVARG -10686 /**87 * @hideinitializer88 * CLI command with the specified name already exist.89 */90 #define PJ_CLI_EBADNAME -10791 92 /**93 40 * This opaque structure represents a CLI application. A CLI application is 94 41 * the root placeholder of other CLI objects. In an application, one (and … … 146 93 */ 147 94 pj_pool_factory *pf; 148 149 /**150 * Specify whether only exact matching command will be executed. If151 * PJ_FALSE, the framework will accept any unique abbreviations of152 * the command. Please see the description of pj_cli_parse() function153 * for more info.154 *155 * Default: PJ_FALSE156 */157 pj_bool_t exact_cmd;158 95 159 96 } pj_cli_cfg; … … 383 320 */ 384 321 PJ_DECL(void) pj_cli_exec_info_default(pj_cli_exec_info *param); 322 323 /** 324 * Write a log message to the CLI application. The CLI application 325 * will send the log message to all the registered front-ends. 326 * 327 * @param cli The CLI application instance. 328 * @param level Verbosity level of this message message. 329 * @param buffer The message itself. 330 * @param len Length of this message. 331 */ 332 PJ_DECL(void) pj_cli_write_log(pj_cli_t *cli, 333 int level, 334 const char *buffer, 335 int len); 385 336 386 337 /** … … 498 449 * registered in the CLI application. 499 450 * 500 * By default, a command may be matched by any shorter abbreviations of the501 * command that uniquely identify the command. For example, suppose two502 * commands "help" and "hold" are currently the only commands registered in503 * the CLI application. In this case, specifying "he" and "hel" would also504 * match "help" command, and similarly "ho" and "hol" would also match "hold"505 * command, but specifying "h" only would yield an error as it would match506 * more than one commands. This matching behavior can be turned off by507 * setting \a pj_cli_cfg.exact_cmd to PJ_TRUE.508 *509 451 * Zero or more arguments follow the command name. Arguments are separated by 510 452 * one or more whitespaces. Argument may be placed inside a pair of quotes, … … 517 459 * 518 460 * The cmdline may be followed by an extra newline (LF or CR-LF characters), 519 * which simply will be ignored. However any more characters following this520 * newline will cause an error to be returned.461 * which will be removed by the function. However any more characters 462 * following this newline will cause an error to be returned. 521 463 * 522 464 * @param sess The CLI session. -
pjproject/branches/projects/cli/pjlib-util/include/pjlib-util/cli_console.h
r3211 r3231 86 86 * instead of the standard gets() or fgets(), since unlike these functions, 87 87 * this is able to end the blocking when pj_cli_quit() is called by other 88 * session. 88 * session. This function requires a thread support. 89 89 * 90 90 * Note that this function would also remove the trailing newlines from the -
pjproject/branches/projects/cli/pjlib-util/include/pjlib-util/config.h
r3087 r3231 267 267 #endif 268 268 269 /* ************************************************************************** 270 * CLI configuration 271 */ 272 273 /** 274 * Initial pool size for CLI. 275 * Default: 1024 bytes 276 */ 277 #ifndef PJ_CLI_POOL_SIZE 278 # define PJ_CLI_POOL_SIZE 1024 279 #endif 280 281 /** 282 * Pool increment size for CLI. 283 * Default: 512 bytes 284 */ 285 #ifndef PJ_CLI_POOL_INC 286 # define PJ_CLI_POOL_INC 512 287 #endif 288 289 /** 290 * Maximum length of command buffer. 291 * Default: 120 292 */ 293 #ifndef PJ_CLI_MAX_CMDBUF 294 # define PJ_CLI_MAX_CMDBUF 120 295 #endif 296 297 /** 298 * Maximum command arguments. 299 * Default: 8 300 */ 301 #ifndef PJ_CLI_MAX_ARGS 302 # define PJ_CLI_MAX_ARGS 8 303 #endif 304 305 /** 306 * Maximum short name version (shortcuts) for a command. 307 * Default: 4 308 */ 309 #ifndef PJ_CLI_MAX_SHORTCUTS 310 # define PJ_CLI_MAX_SHORTCUTS 4 311 #endif 312 313 /** 314 * Initial pool size for console CLI. 315 * Default: 256 bytes 316 */ 317 #ifndef PJ_CLI_CONSOLE_POOL_SIZE 318 # define PJ_CLI_CONSOLE_POOL_SIZE 256 319 #endif 320 321 /** 322 * Pool increment size for console CLI. 323 * Default: 256 bytes 324 */ 325 #ifndef PJ_CLI_CONSOLE_POOL_INC 326 # define PJ_CLI_CONSOLE_POOL_INC 256 327 #endif 328 329 /** 330 * Initial pool size for telnet CLI. 331 * Default: 1024 bytes 332 */ 333 #ifndef PJ_CLI_TELNET_POOL_SIZE 334 # define PJ_CLI_TELNET_POOL_SIZE 1024 335 #endif 336 337 /** 338 * Pool increment size for telnet CLI. 339 * Default: 512 bytes 340 */ 341 #ifndef PJ_CLI_TELNET_POOL_INC 342 # define PJ_CLI_TELNET_POOL_INC 512 343 #endif 344 345 269 346 /** 270 347 * @} -
pjproject/branches/projects/cli/pjlib-util/include/pjlib-util/errno.h
r3087 r3231 387 387 #define PJLIB_UTIL_EHTTPLOST (PJLIB_UTIL_ERRNO_START+155)/* 320155 */ 388 388 389 /************************************************************ 390 * CLI ERROR 391 ***********************************************************/ 392 393 /** 394 * @hideinitializer 395 * End the current session. This is a special error code returned by 396 * pj_cli_exec() to indicate that "exit" or equivalent command has been 397 * called to end the current session. 398 */ 399 #define PJ_CLI_EEXIT (PJLIB_UTIL_ERRNO_START+201)/* 320201 */ 400 /** 401 * @hideinitializer 402 * A required CLI argument is not specified. 403 */ 404 #define PJ_CLI_EMISSINGARG (PJLIB_UTIL_ERRNO_START+202)/* 320202 */ 405 /** 406 * @hideinitializer 407 * Too many CLI arguments. 408 */ 409 #define PJ_CLI_ETOOMANYARGS (PJLIB_UTIL_ERRNO_START+203)/* 320203 */ 410 /** 411 * @hideinitializer 412 * Invalid CLI argument. Typically this is caused by extra characters 413 * specified in the command line which does not match any arguments. 414 */ 415 #define PJ_CLI_EINVARG (PJLIB_UTIL_ERRNO_START+204)/* 320204 */ 416 /** 417 * @hideinitializer 418 * CLI command with the specified name already exist. 419 */ 420 #define PJ_CLI_EBADNAME (PJLIB_UTIL_ERRNO_START+205)/* 320205 */ 421 /** 422 * @hideinitializer 423 * Invalid XML format for CLI command specification. 424 */ 425 #define PJ_CLI_EBADXML (PJLIB_UTIL_ERRNO_START+206)/* 320206 */ 426 /** 427 * @hideinitializer 428 * Telnet connection lost. 429 */ 430 #define PJ_CLI_ETELNETLOST (PJLIB_UTIL_ERRNO_START+211)/* 320211 */ 431 389 432 /** 390 433 * @} -
pjproject/branches/projects/cli/pjlib-util/src/pjlib-util/cli.c
r3211 r3231 30 30 #include <pjlib-util/xml.h> 31 31 32 #define CMD_HASH_TABLE_SIZE 63 /* Hash table size */ 33 34 #define CLI_CMD_CHANGE_LOG 30000 35 #define CLI_CMD_EXIT 30001 36 32 37 #if 1 33 38 /* Enable some tracing */ … … 38 43 #endif 39 44 40 #define CMD_HASH_TABLE_SIZE 63 /* Hash table size */41 42 45 struct pj_cli_t 43 46 { 44 pj_pool_t *pool; /* Pool to allocate memory from */47 pj_pool_t *pool; /* Pool to allocate memory from */ 45 48 pj_cli_cfg cfg; /* CLI configuration */ 46 49 pj_cli_cmd_spec root; /* Root of command tree structure */ 47 50 pj_cli_front_end fe_head; /* List of front-ends */ 48 pj_hash_table_t *hash; /* Command hash table */51 pj_hash_table_t *hash; /* Command hash table */ 49 52 50 53 pj_bool_t is_quitting; … … 68 71 } 69 72 73 PJ_DEF(void) pj_cli_write_log(pj_cli_t *cli, 74 int level, 75 const char *buffer, 76 int len) 77 { 78 struct pj_cli_front_end *fe; 79 80 pj_assert(cli); 81 82 fe = cli->fe_head.next; 83 while (fe != &cli->fe_head) { 84 if (fe->op && fe->op->on_write_log) 85 (*fe->op->on_write_log)(fe, level, buffer, len); 86 fe = fe->next; 87 } 88 } 89 90 /* Command handler */ 91 static pj_status_t cmd_handler(pj_cli_cmd_val *cval) 92 { 93 unsigned level; 94 95 switch(cval->cmd->id) { 96 case CLI_CMD_CHANGE_LOG: 97 level = pj_strtoul(&cval->argv[1]); 98 if (!level && cval->argv[1].slen > 0 && (cval->argv[1].ptr[0] < '0' || 99 cval->argv[1].ptr[0] > '9')) 100 return PJ_CLI_EINVARG; 101 cval->sess->log_level = level; 102 return PJ_SUCCESS; 103 case CLI_CMD_EXIT: 104 pj_cli_end_session(cval->sess); 105 return PJ_CLI_EEXIT; 106 default: 107 return PJ_SUCCESS; 108 } 109 } 110 70 111 PJ_DEF(pj_status_t) pj_cli_create(pj_cli_cfg *cfg, 71 112 pj_cli_t **p_cli) … … 73 114 pj_pool_t *pool; 74 115 pj_cli_t *cli; 116 unsigned i; 117 char* cmd_xmls[] = { 118 "<CMD name='log' id='30000' sc='' desc='Change log level'>" 119 " <ARGS>" 120 " <ARG name='level' type='int' desc='Log level'/>" 121 " </ARGS>" 122 "</CMD>", 123 "<CMD name='exit' id='30001' sc='' desc='Exit session'>" 124 "</CMD>", 125 }; 75 126 76 127 PJ_ASSERT_RETURN(cfg && cfg->pf && p_cli, PJ_EINVAL); 77 128 78 pool = pj_pool_create(cfg->pf, "cli", 1024, 1024, NULL); 129 pool = pj_pool_create(cfg->pf, "cli", PJ_CLI_POOL_SIZE, 130 PJ_CLI_POOL_INC, NULL); 131 if (!pool) 132 return PJ_ENOMEM; 79 133 cli = PJ_POOL_ZALLOC_T(pool, struct pj_cli_t); 80 if (!cli)81 return PJ_ENOMEM;82 134 83 135 pj_memcpy(&cli->cfg, cfg, sizeof(*cfg)); … … 89 141 cli->root.sub_cmd = PJ_POOL_ZALLOC_T(pool, pj_cli_cmd_spec); 90 142 pj_list_init(cli->root.sub_cmd); 143 144 /* Register some standard commands. */ 145 for (i = 0; i < sizeof(cmd_xmls)/sizeof(cmd_xmls[0]); i++) { 146 pj_str_t xml = pj_str(cmd_xmls[i]); 147 148 if (pj_cli_add_cmd_from_xml(cli, NULL, &xml, &cmd_handler, NULL) != 149 PJ_SUCCESS) 150 TRACE_((THIS_FILE, "Failed to add command #%d", i)); 151 } 91 152 92 153 *p_cli = cli; … … 167 228 pj_assert(sess); 168 229 169 if (sess->op ->destroy)230 if (sess->op && sess->op->destroy) 170 231 (*sess->op->destroy)(sess); 171 232 } … … 184 245 pj_cli_cmd_spec *p_cmd) 185 246 { 247 #define ERROR_(STATUS) \ 248 do {status = STATUS; goto on_exit;} while(0) 186 249 pj_pool_t *pool; 187 250 pj_xml_node *root; … … 197 260 /* Parse the xml */ 198 261 pool = pj_pool_create(cli->cfg.pf, "xml", 1024, 1024, NULL); 262 if (!pool) 263 return PJ_ENOMEM; 199 264 root = pj_xml_parse(pool, xml->ptr, xml->slen); 200 265 if (!root) { 201 266 TRACE_((THIS_FILE, "Error: unable to parse XML")); 202 status = PJ_EINVAL; 203 goto on_exit; 204 } 205 206 if (pj_stricmp2(&root->name, "CMD")) { 207 status = PJ_EINVAL; 208 goto on_exit; 209 } 267 ERROR_(PJ_CLI_EBADXML); 268 } 269 270 if (pj_stricmp2(&root->name, "CMD")) 271 ERROR_(PJ_EINVAL); 210 272 211 273 /* Initialize the command spec */ 212 274 cmd = PJ_POOL_ZALLOC_T(cli->pool, struct pj_cli_cmd_spec); 213 if (!cmd) {214 status = PJ_ENOMEM;215 goto on_exit;216 }217 275 218 276 /* Get the command attributes */ … … 227 285 attr->value.slen, NULL)) 228 286 { 229 status = PJ_CLI_EBADNAME; 230 goto on_exit; 287 ERROR_(PJ_CLI_EBADNAME); 231 288 } 232 289 … … 267 324 PJ_CATCH_ANY { 268 325 pj_scan_fini(&scanner); 269 status = PJ_GET_EXCEPTION(); 270 goto on_exit; 326 ERROR_(PJ_GET_EXCEPTION()); 271 327 } 272 328 PJ_END; … … 290 346 pj_cli_arg_spec *arg; 291 347 292 if (cmd->arg_cnt >= PJ_CLI_MAX_ARGS) { 293 status = PJ_CLI_ETOOMANYARGS; 294 goto on_exit; 295 } 348 if (cmd->arg_cnt >= PJ_CLI_MAX_ARGS) 349 ERROR_(PJ_CLI_ETOOMANYARGS); 296 350 arg = &args[cmd->arg_cnt]; 297 351 pj_bzero(arg, sizeof(*arg)); … … 323 377 if (cmd->id == PJ_CLI_CMD_ID_GROUP) { 324 378 /* Command group shouldn't have any shortcuts nor arguments */ 325 if (!cmd->sc_cnt || !cmd->arg_cnt) { 326 status = PJ_EINVAL; 327 goto on_exit; 328 } 379 if (!cmd->sc_cnt || !cmd->arg_cnt) 380 ERROR_(PJ_EINVAL); 329 381 cmd->sub_cmd = PJ_POOL_ALLOC_T(cli->pool, struct pj_cli_cmd_spec); 330 382 pj_list_init(cmd->sub_cmd); 331 383 } 332 384 333 if (!cmd->name.slen) { 334 status = PJ_CLI_EBADNAME; 335 goto on_exit; 336 } 385 if (!cmd->name.slen) 386 ERROR_(PJ_CLI_EBADNAME); 337 387 338 388 if (cmd->arg_cnt) { … … 341 391 cmd->arg = (pj_cli_arg_spec *)pj_pool_zalloc(cli->pool, cmd->arg_cnt * 342 392 sizeof(pj_cli_arg_spec)); 343 if (!cmd->arg) {344 status = PJ_ENOMEM;345 goto on_exit;346 }347 393 for (i = 0; i < cmd->arg_cnt; i++) { 348 394 pj_strdup(cli->pool, &cmd->arg[i].name, &args[i].name); … … 357 403 cmd->sc = (pj_str_t *)pj_pool_zalloc(cli->pool, cmd->sc_cnt * 358 404 sizeof(pj_str_t)); 359 if (!cmd->sc) {360 status = PJ_ENOMEM;361 goto on_exit;362 }363 405 for (i = 0; i < cmd->sc_cnt; i++) { 364 406 pj_strdup(cli->pool, &cmd->sc[i], &sc[i]); 365 pj_hash_set(cli->pool, cli->hash, cmd->sc[i].ptr,366 cmd->sc[i].slen, 0, cmd);407 pj_hash_set(cli->pool, cli->hash, sc[i].ptr, 408 sc[i].slen, 0, cmd); 367 409 } 368 410 } … … 384 426 385 427 return status; 428 #undef ERROR_ 386 429 } 387 430 … … 406 449 /* Parse the command line. */ 407 450 len = pj_ansi_strlen(cmdline); 451 if (len > 0 && cmdline[len - 1] == '\n') { 452 cmdline[--len] = 0; 453 if (len > 0 && cmdline[len - 1] == '\r') 454 cmdline[--len] = 0; 455 } 408 456 pj_scan_init(&scanner, cmdline, len, PJ_SCAN_AUTOSKIP_WS, 409 457 &on_syntax_error); … … 441 489 442 490 if (!pj_scan_is_eof(&scanner)) { 443 pj_scan_get_newline(&scanner); 444 if (!pj_scan_is_eof(&scanner)) 445 PJ_THROW(PJ_CLI_EINVARG); 491 PJ_THROW(PJ_CLI_EINVARG); 446 492 } 447 493 } … … 478 524 info = &einfo; 479 525 status = pj_cli_parse(sess, cmdline, &val, info); 480 481 526 if (status != PJ_SUCCESS) 482 527 return status; -
pjproject/branches/projects/cli/pjlib-util/src/pjlib-util/cli_console.c
r3211 r3231 22 22 #include <pj/assert.h> 23 23 #include <pj/errno.h> 24 #include <pj/log.h> 24 25 #include <pj/os.h> 25 26 #include <pj/pool.h> … … 44 45 }; 45 46 47 static void cli_console_write_log(pj_cli_front_end *fe, int level, 48 const char *data, int len) 49 { 50 struct cli_console_fe * cfe = (struct cli_console_fe *)fe; 51 52 if (cfe->sess->log_level > level) 53 printf("%.*s", len, data); 54 } 55 56 46 57 static void cli_console_quit(pj_cli_front_end *fe, pj_cli_sess *req) 47 58 { … … 65 76 cli_console_quit(fe, NULL); 66 77 78 if (cfe->input_thread) 79 pj_thread_destroy(cfe->input_thread); 67 80 pj_sem_destroy(cfe->thread_sem); 68 81 pj_sem_destroy(cfe->input.sem); … … 90 103 91 104 pool = pj_pool_create(pj_cli_get_param(cli)->pf, "console_fe", 92 256, 256, NULL); 105 PJ_CLI_CONSOLE_POOL_SIZE, PJ_CLI_CONSOLE_POOL_INC, 106 NULL); 107 if (!pool) 108 return PJ_ENOMEM; 93 109 sess = PJ_POOL_ZALLOC_T(pool, pj_cli_sess); 94 110 fe = PJ_POOL_ZALLOC_T(pool, struct cli_console_fe); 95 if (!sess || !fe)96 return PJ_ENOMEM;97 111 98 112 if (!param) { … … 102 116 sess->fe = &fe->base; 103 117 sess->log_level = param->log_level; 118 sess->op = PJ_POOL_ZALLOC_T(pool, struct pj_cli_sess_op); 119 fe->base.op = PJ_POOL_ZALLOC_T(pool, struct pj_cli_front_end_op); 104 120 fe->base.cli = cli; 105 121 fe->base.type = PJ_CLI_CONSOLE_FRONT_END; 106 fe->base.op = PJ_POOL_ZALLOC_T(pool, struct pj_cli_front_end_op);122 fe->base.op->on_write_log = &cli_console_write_log; 107 123 fe->base.op->on_quit = &cli_console_quit; 108 124 fe->base.op->on_destroy = &cli_console_destroy; … … 128 144 fgets(fe->input.buf, fe->input.maxlen, stdin); 129 145 for (i = pj_ansi_strlen(fe->input.buf) - 1; i >= 0; i--) { 130 if (fe->input.buf[i] == '\n' )146 if (fe->input.buf[i] == '\n' || fe->input.buf[i] == '\r') 131 147 fe->input.buf[i] = 0; 132 148 else … … 137 153 pj_sem_wait(fe->thread_sem); 138 154 } 139 pj_sem_post(fe->input.sem);140 155 fe->input_thread = NULL; 141 156 … … 155 170 156 171 if (!fe->input_thread) { 157 if (pj_thread_create(fe->pool, NULL, &readline_thread, fe, 158 0, 0, &fe->input_thread) != PJ_SUCCESS) 159 { 160 return PJ_EUNKNOWN; 161 } 172 pj_status_t status; 173 174 status = pj_thread_create(fe->pool, NULL, &readline_thread, fe, 175 0, 0, &fe->input_thread); 176 if (status != PJ_SUCCESS) 177 return status; 162 178 } else { 163 179 /* Wake up readline thread */ … … 166 182 167 183 pj_sem_wait(fe->input.sem); 168 169 return ( fe->thread_quit? PJ_CLI_EEXIT : PJ_SUCCESS);184 185 return (pj_cli_is_quitting(fe->base.cli)? PJ_CLI_EEXIT : PJ_SUCCESS); 170 186 } -
pjproject/branches/projects/cli/pjlib-util/src/pjlib-util/errno.c
r3087 r3231 96 96 PJ_BUILD_ERR( PJLIB_UTIL_EHTTPINSBUF, "Insufficient buffer"), 97 97 PJ_BUILD_ERR( PJLIB_UTIL_EHTTPLOST, "Connection lost"), 98 99 /* CLI */ 100 PJ_BUILD_ERR( PJ_CLI_EEXIT, "Exit current session"), 101 PJ_BUILD_ERR( PJ_CLI_EMISSINGARG, "Missing argument"), 102 PJ_BUILD_ERR( PJ_CLI_ETOOMANYARGS, "Too many arguments"), 103 PJ_BUILD_ERR( PJ_CLI_EINVARG, "Invalid argument"), 104 PJ_BUILD_ERR( PJ_CLI_EBADNAME, "Command name already exists"), 105 PJ_BUILD_ERR( PJ_CLI_EBADXML, "Invalid XML format"), 106 PJ_BUILD_ERR( PJ_CLI_ETELNETLOST, "Connection lost"), 98 107 }; 99 108 #endif /* PJ_HAS_ERROR_STRING */ -
pjproject/branches/projects/cli/pjsip-apps/build/Samples-vc.mak
r3141 r3231 61 61 SAMPLES = $(BINDIR)\auddemo.exe \ 62 62 $(BINDIR)\aectest.exe \ 63 $(BINDIR)\clidemo.exe \ 63 64 $(BINDIR)\confsample.exe \ 64 65 $(BINDIR)\confbench.exe \ -
pjproject/branches/projects/cli/pjsip-apps/build/Samples.mak
r3141 r3231 16 16 SAMPLES := auddemo \ 17 17 aectest \ 18 clidemo \ 18 19 confsample \ 19 20 encdec \ -
pjproject/branches/projects/cli/pjsip-apps/build/samples.vcproj
r3087 r3231 1599 1599 </File> 1600 1600 <File 1601 RelativePath="..\src\samples\clidemo.c" 1602 > 1603 </File> 1604 <File 1601 1605 RelativePath="..\src\samples\confbench.c" 1602 1606 >
Note: See TracChangeset
for help on using the changeset viewer.