diff -Nuar asterisk.orig/asterisk.c asterisk/asterisk.c --- asterisk.orig/asterisk.c 2005-07-12 13:41:26.000000000 -0400 +++ asterisk/asterisk.c 2005-07-12 13:11:21.000000000 -0400 @@ -147,6 +147,10 @@ char ast_config_AST_PID[AST_CONFIG_MAX_PATH]; char ast_config_AST_SOCKET[AST_CONFIG_MAX_PATH]; char ast_config_AST_RUN_DIR[AST_CONFIG_MAX_PATH]; +char ast_config_AST_CTL_PERMISSIONS[AST_CONFIG_MAX_PATH]; +char ast_config_AST_CTL_OWNER[AST_CONFIG_MAX_PATH]; +char ast_config_AST_CTL_GROUP[AST_CONFIG_MAX_PATH]; +char ast_config_AST_CTL[AST_CONFIG_MAX_PATH] = "asterisk.ctl"; static char *_argv[256]; static int shuttingdown = 0; @@ -533,16 +537,11 @@ int res; int x; - struct ast_config *cfg; - char *config = AST_CONFIG_FILE; - char *owner; - char *group; - char *perms; - uid_t uid; - gid_t gid; + uid_t uid = -1; + gid_t gid = -1; - for (x=0;xpw_uid; + if ((pw = getpwnam(ast_config_AST_CTL_OWNER)) == NULL) { + ast_log(LOG_WARNING, "Unable to find uid of user %s\n", ast_config_AST_CTL_OWNER); + } else { + uid = pw->pw_uid; + } } - if (group!=NULL) { + if (!ast_config_AST_CTL_GROUP) { struct group *grp; - if ((grp=getgrnam(group))==NULL) - ast_log(LOG_WARNING, "Unable to find gid of group %s\n", group); - else - gid=grp->gr_gid; + if ((grp = getgrnam(ast_config_AST_CTL_GROUP)) == NULL) { + ast_log(LOG_WARNING, "Unable to find gid of group %s\n", ast_config_AST_CTL_GROUP); + } else { + gid = grp->gr_gid; + } } - if (chown(ast_config_AST_SOCKET,uid,gid)<0) - ast_log(LOG_WARNING, "Unable to change ownership of %s: %s\n", ast_config_AST_SOCKET,strerror(errno)); + if (chown(ast_config_AST_SOCKET, uid, gid) < 0) + ast_log(LOG_WARNING, "Unable to change ownership of %s: %s\n", ast_config_AST_SOCKET, strerror(errno)); - if (perms!=NULL) { + if (!ast_config_AST_CTL_PERMISSIONS) { mode_t p; - sscanf(perms, "%o", (int *) &p); - if ((chmod(ast_config_AST_SOCKET,p))<0) - ast_log(LOG_WARNING, "Unable to change file permissions of %s: %s\n", ast_config_AST_SOCKET,strerror(errno)); + sscanf(ast_config_AST_CTL_PERMISSIONS, "%o", (int *) &p); + if ((chmod(ast_config_AST_SOCKET, p)) < 0) + ast_log(LOG_WARNING, "Unable to change file permissions of %s: %s\n", ast_config_AST_SOCKET, strerror(errno)); } return 0; @@ -1689,7 +1673,6 @@ static void ast_readconfig(void) { struct ast_config *cfg; struct ast_variable *v; - struct ast_variable *v_ctlfile; char *config = AST_CONFIG_FILE; if (option_overrideconfig == 1) { @@ -1701,51 +1684,58 @@ } /* init with buildtime config */ - ast_copy_string((char *)ast_config_AST_CONFIG_DIR,AST_CONFIG_DIR,sizeof(ast_config_AST_CONFIG_DIR)); - ast_copy_string((char *)ast_config_AST_SPOOL_DIR,AST_SPOOL_DIR,sizeof(ast_config_AST_SPOOL_DIR)); - ast_copy_string((char *)ast_config_AST_MODULE_DIR,AST_MODULE_DIR,sizeof(ast_config_AST_VAR_DIR)); - snprintf((char *)ast_config_AST_MONITOR_DIR,sizeof(ast_config_AST_MONITOR_DIR)-1,"%s/monitor",ast_config_AST_SPOOL_DIR); - ast_copy_string((char *)ast_config_AST_VAR_DIR,AST_VAR_DIR,sizeof(ast_config_AST_VAR_DIR)); - ast_copy_string((char *)ast_config_AST_LOG_DIR,AST_LOG_DIR,sizeof(ast_config_AST_LOG_DIR)); - ast_copy_string((char *)ast_config_AST_AGI_DIR,AST_AGI_DIR,sizeof(ast_config_AST_AGI_DIR)); - ast_copy_string((char *)ast_config_AST_DB,AST_DB,sizeof(ast_config_AST_DB)); - ast_copy_string((char *)ast_config_AST_KEY_DIR,AST_KEY_DIR,sizeof(ast_config_AST_KEY_DIR)); - ast_copy_string((char *)ast_config_AST_PID,AST_PID,sizeof(ast_config_AST_PID)); - ast_copy_string((char *)ast_config_AST_SOCKET,AST_SOCKET,sizeof(ast_config_AST_SOCKET)); - ast_copy_string((char *)ast_config_AST_RUN_DIR,AST_RUN_DIR,sizeof(ast_config_AST_RUN_DIR)); - + ast_copy_string((char *)ast_config_AST_CONFIG_DIR, AST_CONFIG_DIR, sizeof(ast_config_AST_CONFIG_DIR)); + ast_copy_string((char *)ast_config_AST_SPOOL_DIR, AST_SPOOL_DIR, sizeof(ast_config_AST_SPOOL_DIR)); + ast_copy_string((char *)ast_config_AST_MODULE_DIR, AST_MODULE_DIR, sizeof(ast_config_AST_VAR_DIR)); + snprintf((char *)ast_config_AST_MONITOR_DIR, sizeof(ast_config_AST_MONITOR_DIR) - 1, "%s/monitor", ast_config_AST_SPOOL_DIR); + ast_copy_string((char *)ast_config_AST_VAR_DIR, AST_VAR_DIR, sizeof(ast_config_AST_VAR_DIR)); + ast_copy_string((char *)ast_config_AST_LOG_DIR, AST_LOG_DIR, sizeof(ast_config_AST_LOG_DIR)); + ast_copy_string((char *)ast_config_AST_AGI_DIR, AST_AGI_DIR, sizeof(ast_config_AST_AGI_DIR)); + ast_copy_string((char *)ast_config_AST_DB, AST_DB, sizeof(ast_config_AST_DB)); + ast_copy_string((char *)ast_config_AST_KEY_DIR, AST_KEY_DIR, sizeof(ast_config_AST_KEY_DIR)); + ast_copy_string((char *)ast_config_AST_PID, AST_PID, sizeof(ast_config_AST_PID)); + ast_copy_string((char *)ast_config_AST_SOCKET, AST_SOCKET, sizeof(ast_config_AST_SOCKET)); + ast_copy_string((char *)ast_config_AST_RUN_DIR, AST_RUN_DIR, sizeof(ast_config_AST_RUN_DIR)); + /* no asterisk.conf? no problem, use buildtime config! */ if (!cfg) { return; } - v_ctlfile = ast_variable_browse(cfg, "files"); - while (v_ctlfile!=NULL) { - if (strcmp(v_ctlfile->name,"astctl")==0) - break; - v_ctlfile=v_ctlfile->next; + v = ast_variable_browse(cfg, "files"); + while (v) { + if (!strcasecmp(v->name, "astctlpermissions")) { + ast_copy_string((char *)ast_config_AST_CTL_PERMISSIONS, v->value, sizeof(ast_config_AST_CTL_PERMISSIONS)); + } else if (!strcasecmp(v->name, "astctlowner")) { + ast_copy_string((char *)ast_config_AST_CTL_OWNER, v->value, sizeof(ast_config_AST_CTL_OWNER)); + } else if (!strcasecmp(v->name, "astctlgroup")) { + ast_copy_string((char *)ast_config_AST_CTL_GROUP, v->value, sizeof(ast_config_AST_CTL_GROUP)); + } else if (!strcasecmp(v->name, "astctl")) { + ast_copy_string((char *)ast_config_AST_CTL, v->value, sizeof(ast_config_AST_CTL)); + } + v = v->next; } v = ast_variable_browse(cfg, "directories"); while(v) { if (!strcasecmp(v->name, "astetcdir")) { - ast_copy_string((char *)ast_config_AST_CONFIG_DIR,v->value,sizeof(ast_config_AST_CONFIG_DIR)); + ast_copy_string((char *)ast_config_AST_CONFIG_DIR, v->value, sizeof(ast_config_AST_CONFIG_DIR)); } else if (!strcasecmp(v->name, "astspooldir")) { - ast_copy_string((char *)ast_config_AST_SPOOL_DIR,v->value,sizeof(ast_config_AST_SPOOL_DIR)); - snprintf((char *)ast_config_AST_MONITOR_DIR,sizeof(ast_config_AST_MONITOR_DIR)-1,"%s/monitor",v->value); + ast_copy_string((char *)ast_config_AST_SPOOL_DIR, v->value, sizeof(ast_config_AST_SPOOL_DIR)); + snprintf((char *)ast_config_AST_MONITOR_DIR, sizeof(ast_config_AST_MONITOR_DIR) - 1, "%s/monitor", v->value); } else if (!strcasecmp(v->name, "astvarlibdir")) { - ast_copy_string((char *)ast_config_AST_VAR_DIR,v->value,sizeof(ast_config_AST_VAR_DIR)); - snprintf((char *)ast_config_AST_DB,sizeof(ast_config_AST_DB),"%s/%s",v->value,"astdb"); + ast_copy_string((char *)ast_config_AST_VAR_DIR, v->value, sizeof(ast_config_AST_VAR_DIR)); + snprintf((char *)ast_config_AST_DB, sizeof(ast_config_AST_DB), "%s/%s", v->value, "astdb"); } else if (!strcasecmp(v->name, "astlogdir")) { - ast_copy_string((char *)ast_config_AST_LOG_DIR,v->value,sizeof(ast_config_AST_LOG_DIR)); + ast_copy_string((char *)ast_config_AST_LOG_DIR, v->value, sizeof(ast_config_AST_LOG_DIR)); } else if (!strcasecmp(v->name, "astagidir")) { - ast_copy_string((char *)ast_config_AST_AGI_DIR,v->value,sizeof(ast_config_AST_AGI_DIR)); + ast_copy_string((char *)ast_config_AST_AGI_DIR, v->value, sizeof(ast_config_AST_AGI_DIR)); } else if (!strcasecmp(v->name, "astrundir")) { - snprintf((char *)ast_config_AST_PID,sizeof(ast_config_AST_PID),"%s/%s",v->value,"asterisk.pid"); - snprintf((char *)ast_config_AST_SOCKET,sizeof(ast_config_AST_SOCKET),"%s/%s",v->value,v_ctlfile==NULL?"asterisk.ctl":v_ctlfile->value); - ast_copy_string((char *)ast_config_AST_RUN_DIR,v->value,sizeof(ast_config_AST_RUN_DIR)); + snprintf((char *)ast_config_AST_PID, sizeof(ast_config_AST_PID), "%s/%s", v->value, "asterisk.pid"); + snprintf((char *)ast_config_AST_SOCKET, sizeof(ast_config_AST_SOCKET), "%s/%s", v->value, ast_config_AST_CTL); + ast_copy_string((char *)ast_config_AST_RUN_DIR, v->value, sizeof(ast_config_AST_RUN_DIR)); } else if (!strcasecmp(v->name, "astmoddir")) { - ast_copy_string((char *)ast_config_AST_MODULE_DIR,v->value,sizeof(ast_config_AST_MODULE_DIR)); + ast_copy_string((char *)ast_config_AST_MODULE_DIR, v->value, sizeof(ast_config_AST_MODULE_DIR)); } v = v->next; } @@ -1753,7 +1743,7 @@ while(v) { /* verbose level (-v at startup) */ if (!strcasecmp(v->name, "verbose")) { - option_verbose= atoi(v->value); + option_verbose = atoi(v->value); /* whether or not to force timestamping. (-T at startup) */ } else if (!strcasecmp(v->name, "timestamp")) { option_timestamp = ast_true(v->value); diff -Nuar asterisk.orig/include/asterisk.h asterisk/include/asterisk.h --- asterisk.orig/include/asterisk.h 2005-07-05 18:11:43.000000000 -0400 +++ asterisk/include/asterisk.h 2005-07-12 13:39:52.000000000 -0400 @@ -32,6 +32,10 @@ extern char ast_config_AST_PID[AST_CONFIG_MAX_PATH]; extern char ast_config_AST_SOCKET[AST_CONFIG_MAX_PATH]; extern char ast_config_AST_RUN_DIR[AST_CONFIG_MAX_PATH]; +extern char ast_config_AST_CTL_PERMISSIONS[AST_CONFIG_MAX_PATH]; +extern char ast_config_AST_CTL_OWNER[AST_CONFIG_MAX_PATH]; +extern char ast_config_AST_CTL_GROUP[AST_CONFIG_MAX_PATH]; +extern char ast_config_AST_CTL[AST_CONFIG_MAX_PATH]; /* Provided by module.c */ extern int load_modules(const int preload_only);