static NTSTATUS share_sanity_checks(const struct tsocket_address *remote_address, const char *rhost, int snum, fstring dev) { char *raddr; raddr = tsocket_address_inet_addr_string(remote_address, talloc_tos()); if (raddr == NULL) { return NT_STATUS_NO_MEMORY; } if (!lp_snum_ok(snum) || !allow_access(lp_hosts_deny(snum), lp_hosts_allow(snum), rhost, raddr)) { return NT_STATUS_ACCESS_DENIED; } if (dev[0] == '?' || !dev[0]) { if (lp_printable(snum)) { fstrcpy(dev,"LPT1:"); } else if (strequal(lp_fstype(snum), "IPC")) { fstrcpy(dev, "IPC"); } else { fstrcpy(dev,"A:"); } } if (!strupper_m(dev)) { DEBUG(2,("strupper_m %s failed\n", dev)); return NT_STATUS_INVALID_PARAMETER; } if (lp_printable(snum)) { if (!strequal(dev, "LPT1:")) { return NT_STATUS_BAD_DEVICE_TYPE; } } else if (strequal(lp_fstype(snum), "IPC")) { if (!strequal(dev, "IPC")) { return NT_STATUS_BAD_DEVICE_TYPE; } } else if (!strequal(dev, "A:")) { return NT_STATUS_BAD_DEVICE_TYPE; } /* Behave as a printer if we are supposed to */ if (lp_printable(snum) && (strcmp(dev, "A:") == 0)) { fstrcpy(dev, "LPT1:"); } return NT_STATUS_OK; }
static NTSTATUS share_sanity_checks(int snum, fstring dev) { if (!lp_snum_ok(snum) || !check_access(smbd_server_fd(), lp_hostsallow(snum), lp_hostsdeny(snum))) { return NT_STATUS_ACCESS_DENIED; } if (dev[0] == '?' || !dev[0]) { if (lp_print_ok(snum)) { fstrcpy(dev,"LPT1:"); } else if (strequal(lp_fstype(snum), "IPC")) { fstrcpy(dev, "IPC"); } else { fstrcpy(dev,"A:"); } } strupper_m(dev); if (lp_print_ok(snum)) { if (!strequal(dev, "LPT1:")) { return NT_STATUS_BAD_DEVICE_TYPE; } } else if (strequal(lp_fstype(snum), "IPC")) { if (!strequal(dev, "IPC")) { return NT_STATUS_BAD_DEVICE_TYPE; } } else if (!strequal(dev, "A:")) { return NT_STATUS_BAD_DEVICE_TYPE; } /* Behave as a printer if we are supposed to */ if (lp_print_ok(snum) && (strcmp(dev, "A:") == 0)) { fstrcpy(dev, "LPT1:"); } return NT_STATUS_OK; }
static uint32 _srv_SMBtcon_NT1(PSESS_HND sess_hnd, uint16 *conn_tid, Q_TCON_ANDX_4 *q4, Q_TCON_ANDX_D_4 *qd4, R_TCON_ANDX_3 *r3, R_TCON_ANDX_D_3 *rd3) { PCONN_HND conn_hnd = NULL; int snum = -1; SMBSTR *dir_path = NULL; const char *path = smbstrA(&qd4->path); const char *dev = smbstrA(&qd4->device); char *service; struct vfs_connection_struct *vfs_conn; struct smb_connection_struct *conn; BOOL is_ipc; BOOL is_print; uint32 err = NT_STATUS_NOPROBLEMO; conn_hnd = find_conn_hnd_by_index(sess_hnd, *conn_tid); if (conn_hnd != NULL) { DEBUG(10,("close connection %d\n", *conn_tid)); conn_close_hnd(conn_hnd); } if (path == NULL || dev == NULL) return ERRDOS|ERRnosuchshare; DEBUG(10,("path: [%s] device: [%s]\n", path, dev)); service = strchr(path+2, '\\') + 1; snum = lp_servicenumber(service); if (snum < 0) { err = ERRDOS|ERRnosuchshare; goto end; } if (!create_conn_hnd(sess_hnd, &conn_hnd, NULL) || conn_hnd == NULL || !get_conn_index(conn_hnd, conn_tid)) { err = NT_STATUS_INVALID_HANDLE; goto end; } is_ipc = strequal(dev, "IPC") || strequal(service, "IPC$"); is_print = strequal(dev, "LPT:"); vfs_conn = g_new(struct vfs_connection_struct, 1); if (vfs_conn == NULL) { err = NT_STATUS_NO_MEMORY; goto end; } conn = g_new(struct smb_connection_struct, 1); if (conn == NULL) { err = NT_STATUS_NO_MEMORY; goto end; } if (is_ipc) { rd3->service = "IPC"; smbstr_initA(&rd3->nativefs, "", 0); dir_path = NULL; vfs_init_ipc(vfs_conn, snum); smbvfs_init_ipc(conn, snum); } else if (is_print) { rd3->service = "LPT:"; smbstr_initA(&rd3->nativefs, "", 0); dir_path = smbstr_setA("", 0); vfs_init_print(vfs_conn, snum); smbvfs_init_print(conn, snum); } else { rd3->service = "A:"; smbstr_initA(&rd3->nativefs, lp_fstype(snum), 0); dir_path = smbstr_setA(lp_pathname(snum), 0); vfs_init_fs(vfs_conn, snum); smbvfs_init_fs(conn, snum); } vfs_conn->connectpath = smbstr_dup(dir_path); if (!set_conn_info(conn_hnd, vfs_conn, conn, smbstr_dup(&qd4->path), dir_path)) { err = NT_STATUS_INVALID_HANDLE; goto end; } DEBUG(10,("service: [%s] snum: [%d] tid: [%d]\n", dir_path ? smbstrA(dir_path) : "", snum, *conn_tid)); end: if (err) { DEBUG(10,("error:[%x]\n", err)); conn_close_hnd(conn_hnd); } return err; }