/***************************************************** setup the shared area *******************************************************/ void smbw_setup_shared(void) { int fd; pstring name, s; slprintf(name,sizeof(name)-1, "%s/smbw.XXXXXX",tmpdir()); fd = smb_mkstemp(name); if (fd == -1) goto failed; unlink(name); shared_fd = set_maxfiles(SMBW_MAX_OPEN); while (shared_fd && dup2(fd, shared_fd) != shared_fd) shared_fd--; if (shared_fd == 0) goto failed; close(fd); DEBUG(4,("created shared_fd=%d\n", shared_fd)); slprintf(s,sizeof(s)-1,"%d", shared_fd); setenv("SMBW_HANDLE", s, 1); return; failed: perror("Failed to setup shared variable area "); exit(1); }
static int setup_out_fd(void) { int fd; TALLOC_CTX *ctx = talloc_stackframe(); char *path = NULL; path = talloc_asprintf(ctx, "%s/smb.XXXXXX", tmpdir()); if (!path) { TALLOC_FREE(ctx); errno = ENOMEM; return -1; } /* now create the file */ fd = smb_mkstemp(path); if (fd == -1) { DEBUG(0,("setup_out_fd: Failed to create file %s. (%s)\n", path, strerror(errno) )); TALLOC_FREE(ctx); return -1; } DEBUG(10,("setup_out_fd: Created tmp file %s\n", path )); /* Ensure file only kept around by open fd. */ unlink(path); TALLOC_FREE(ctx); return fd; }
static int setup_out_fd(void) { int fd; pstring path; slprintf(path, sizeof(path)-1, "%s/smb.XXXXXX", tmpdir()); /* now create the file */ fd = smb_mkstemp(path); if (fd == -1) { DEBUG(0,("setup_out_fd: Failed to create file %s. (%s)\n", path, strerror(errno) )); return -1; } DEBUG(10,("setup_out_fd: Created tmp file %s\n", path )); /* Ensure file only kept around by open fd. */ unlink(path); return fd; }
static NTSTATUS ldif_init_context(TALLOC_CTX *mem_ctx, enum netr_SamDatabaseID database_id, const char *ldif_filename, const char *domain_sid_str, struct samsync_ldif_context **ctx) { NTSTATUS status = NT_STATUS_UNSUCCESSFUL; struct samsync_ldif_context *r; const char *add_template = "/tmp/add.ldif.XXXXXX"; const char *mod_template = "/tmp/mod.ldif.XXXXXX"; const char *builtin_sid = "S-1-5-32"; /* Get other smb.conf data */ if (!(lp_workgroup()) || !*(lp_workgroup())) { DEBUG(0,("workgroup missing from smb.conf--exiting\n")); exit(1); } /* Get the ldap suffix */ if (!(lp_ldap_suffix()) || !*(lp_ldap_suffix())) { DEBUG(0,("ldap suffix missing from smb.conf--exiting\n")); exit(1); } if (*ctx && (*ctx)->initialized) { return NT_STATUS_OK; } r = TALLOC_ZERO_P(mem_ctx, struct samsync_ldif_context); NT_STATUS_HAVE_NO_MEMORY(r); /* Get the ldap suffix */ r->suffix = lp_ldap_suffix(); /* Ensure we have an output file */ if (ldif_filename) { r->ldif_file = fopen(ldif_filename, "a"); } else { r->ldif_file = stdout; } if (!r->ldif_file) { fprintf(stderr, "Could not open %s\n", ldif_filename); DEBUG(1, ("Could not open %s\n", ldif_filename)); status = NT_STATUS_UNSUCCESSFUL; goto done; } r->add_template = talloc_strdup(mem_ctx, add_template); r->mod_template = talloc_strdup(mem_ctx, mod_template); if (!r->add_template || !r->mod_template) { status = NT_STATUS_NO_MEMORY; goto done; } r->add_name = talloc_strdup(mem_ctx, add_template); r->mod_name = talloc_strdup(mem_ctx, mod_template); if (!r->add_name || !r->mod_name) { status = NT_STATUS_NO_MEMORY; goto done; } /* Open the add and mod ldif files */ if (!(r->add_file = fdopen(smb_mkstemp(r->add_name),"w"))) { DEBUG(1, ("Could not open %s\n", r->add_name)); status = NT_STATUS_UNSUCCESSFUL; goto done; } if (!(r->mod_file = fdopen(smb_mkstemp(r->mod_name),"w"))) { DEBUG(1, ("Could not open %s\n", r->mod_name)); status = NT_STATUS_UNSUCCESSFUL; goto done; } /* Allocate initial memory for groupmap and accountmap arrays */ r->groupmap = TALLOC_ZERO_ARRAY(mem_ctx, GROUPMAP, 8); r->accountmap = TALLOC_ZERO_ARRAY(mem_ctx, ACCOUNTMAP, 8); if (r->groupmap == NULL || r->accountmap == NULL) { DEBUG(1,("GROUPMAP talloc failed\n")); status = NT_STATUS_NO_MEMORY; goto done; } /* Remember how many we malloced */ r->num_alloced = 8; /* Initial database population */ if (database_id == SAM_DATABASE_DOMAIN) { status = populate_ldap_for_ldif(domain_sid_str, r->suffix, builtin_sid, r->add_file); if (!NT_STATUS_IS_OK(status)) { goto done; } status = map_populate_groups(mem_ctx, r->groupmap, r->accountmap, domain_sid_str, r->suffix, builtin_sid); if (!NT_STATUS_IS_OK(status)) { goto done; } } r->initialized = true; *ctx = r; return NT_STATUS_OK; done: TALLOC_FREE(r); return status; }
static NTSTATUS convert_file_from_ucs2(TALLOC_CTX *mem_ctx, const char *filename_in, char **filename_out) { int tmp_fd = -1; uint8 *data_in = NULL; uint8 *data_out = NULL; char *tmp_name = NULL; NTSTATUS status; size_t n = 0; if (!filename_out) { return NT_STATUS_INVALID_PARAMETER; } data_in = (uint8 *)file_load(filename_in, &n, 0); if (!data_in) { status = NT_STATUS_NO_SUCH_FILE; goto out; } tmp_name = talloc_asprintf(mem_ctx, "%s/convert_file_from_ucs2.XXXXXX", tmpdir()); if (!tmp_name) { status = NT_STATUS_NO_MEMORY; goto out; } tmp_fd = smb_mkstemp(tmp_name); if (tmp_fd == -1) { status = NT_STATUS_ACCESS_DENIED; goto out; } n = convert_string_talloc(mem_ctx, CH_UTF16LE, CH_UNIX, data_in, n, &data_out, False); if (n == -1) { status = NT_STATUS_INVALID_BUFFER_SIZE; goto out; } /* skip utf8 BOM */ DEBUG(11,("convert_file_from_ucs2: " "data_out[0]: 0x%x, data_out[1]: 0x%x, data_out[2]: 0x%x\n", data_out[0], data_out[1], data_out[2])); if ((data_out[0] == 0xef) && (data_out[1] == 0xbb) && (data_out[2] == 0xbf)) { DEBUG(11,("convert_file_from_ucs2: " "%s skipping utf8 BOM\n", tmp_name)); data_out += 3; n -= 3; } if (sys_write(tmp_fd, data_out, n) != n) { status = map_nt_error_from_unix(errno); goto out; } *filename_out = tmp_name; status = NT_STATUS_OK; out: if (tmp_fd != -1) { close(tmp_fd); } SAFE_FREE(data_in); return status; }
/**************************************************************************** deliver the message ****************************************************************************/ static void msg_deliver(void) { pstring name; int i; int fd; char *msg; int len; if (! (*lp_msg_command())) { DEBUG(1,("no messaging command specified\n")); msgpos = 0; return; } /* put it in a temporary file */ slprintf(name,sizeof(name)-1, "%s/msg.XXXXXX",tmpdir()); fd = smb_mkstemp(name); if (fd == -1) { DEBUG(1,("can't open message file %s\n",name)); return; } /* * Incoming message is in DOS codepage format. Convert to UNIX. */ if ((len = convert_string_allocate(NULL,CH_DOS, CH_UNIX, msgbuf, msgpos, (void **) &msg)) < 0 || !msg) { DEBUG(3,("Conversion failed, delivering message in DOS codepage format\n")); for (i = 0; i < msgpos;) { if (msgbuf[i] == '\r' && i < (msgpos-1) && msgbuf[i+1] == '\n') { i++; continue; } write(fd, &msgbuf[i++], 1); } } else { for (i = 0; i < len;) { if (msg[i] == '\r' && i < (len-1) && msg[i+1] == '\n') { i++; continue; } write(fd, &msg[i++],1); } SAFE_FREE(msg); } close(fd); /* run the command */ if (*lp_msg_command()) { fstring alpha_msgfrom; fstring alpha_msgto; pstring s; pstrcpy(s,lp_msg_command()); pstring_sub(s,"%f",alpha_strcpy(alpha_msgfrom,msgfrom,NULL,sizeof(alpha_msgfrom))); pstring_sub(s,"%t",alpha_strcpy(alpha_msgto,msgto,NULL,sizeof(alpha_msgto))); standard_sub_basic(current_user_info.smb_name, s, sizeof(s)); pstring_sub(s,"%s",name); smbrun(s,NULL); } msgpos = 0; }