static int readahead_connect(struct vfs_handle_struct *handle, const char *service, const char *user) { struct readahead_data *rhd = SMB_MALLOC_P(struct readahead_data); if (!rhd) { DEBUG(0,("readahead_connect: out of memory\n")); return -1; } ZERO_STRUCTP(rhd); rhd->didmsg = False; rhd->off_bound = conv_str_size(lp_parm_const_string(SNUM(handle->conn), "readahead", "offset", NULL)); if (rhd->off_bound == 0) { rhd->off_bound = 0x80000; } rhd->len = conv_str_size(lp_parm_const_string(SNUM(handle->conn), "readahead", "length", NULL)); if (rhd->len == 0) { rhd->len = rhd->off_bound; } handle->data = (void *)rhd; handle->free_data = free_readahead_data; return SMB_VFS_NEXT_CONNECT(handle, service, user); }
static SMB_OFF_T vfs_my_module_maxsize(vfs_handle_struct *handle) { SMB_OFF_T maxsize; maxsize = conv_str_size(lp_parm_const_string(SNUM(handle->conn), "vfs_my_module", "maxsize", "536870912")); return maxsize; }
static SMB_OFF_T recycle_minsize(vfs_handle_struct *handle) { SMB_OFF_T minsize; minsize = conv_str_size(lp_parm_const_string(SNUM(handle->conn), "recycle", "minsize", NULL)); DEBUG(10, ("recycle: minsize = %lu\n", (long unsigned int)minsize)); return minsize; }
static int cprime_connect( struct vfs_handle_struct * handle, const char * service, const char * user) { module_debug = lp_parm_int(SNUM(handle->conn), MODULE, "debug", 100); if (g_readbuf) { /* Only allocate g_readbuf once. If the config changes and * another client multiplexes onto this smbd, we don't want * to risk memory corruption. */ return SMB_VFS_NEXT_CONNECT(handle, service, user); } g_readsz = conv_str_size(lp_parm_const_string(SNUM(handle->conn), MODULE, "rsize", NULL)); if (g_readsz < READAHEAD_MIN) { DEBUG(module_debug, ("%s: %ld bytes of readahead " "requested, using minimum of %u\n", MODULE, (long)g_readsz, READAHEAD_MIN)); g_readsz = READAHEAD_MIN; } else if (g_readsz > READAHEAD_MAX) { DEBUG(module_debug, ("%s: %ld bytes of readahead " "requested, using maximum of %u\n", MODULE, (long)g_readsz, READAHEAD_MAX)); g_readsz = READAHEAD_MAX; } if ((g_readbuf = SMB_MALLOC(g_readsz)) == NULL) { /* Turn off readahead if we can't get a buffer. */ g_readsz = 0; } return SMB_VFS_NEXT_CONNECT(handle, service, user); }
int set_arg_argv(const char * argv) { struct argdef * arg; char * name; char * val; if ((name = strdup(argv)) == NULL) { return(0); } if ((val = strchr(name, '=')) == NULL) { fprintf(stderr, "%s: malformed argument \"%s\"\n", PROGNAME, argv); goto fail; } *val = '\0'; val++; if ((arg = find_named_arg(name)) == NULL) { fprintf(stderr, "%s: ignoring unknown argument \"%s\"\n", PROGNAME, name); goto fail; } /* Found a matching name; convert the variable argument. */ switch (arg->arg_type) { case ARG_NUMERIC: if (!conv_str_u64(val, &arg->arg_val.nval)) { goto fail; } break; case ARG_SIZE: if (!conv_str_size(val, &arg->arg_val.nval)) { goto fail; } break; case ARG_BOOL: if (!conv_str_bool(val, &arg->arg_val.bval)) { goto fail; } break; case ARG_PATHNAME: if (!(arg->arg_val.pval = strdup(val))) { goto fail; } break; default: fprintf(stderr, "%s: argument \"%s\" is of " "unknown type\n", PROGNAME, name); goto fail; } free(name); return(1); fail: free(name); return(0); }
static int prealloc_open(vfs_handle_struct* handle, const char * fname, files_struct * fsp, int flags, mode_t mode) { int fd; SMB_OFF_T size = 0; const char * dot; char fext[10]; if (!(flags & (O_CREAT|O_TRUNC))) { /* Caller is not intending to rewrite the file. Let's not mess * with the allocation in this case. */ goto normal_open; } *fext = '\0'; dot = strrchr(fname, '.'); if (dot && *++dot) { if (strlen(dot) < sizeof(fext)) { strncpy(fext, dot, sizeof(fext)); strnorm(fext, CASE_LOWER); } } if (*fext == '\0') { goto normal_open; } /* Syntax for specifying preallocation size is: * MODULE: <extension> = <size> * where * <extension> is the file extension in lower case * <size> is a size like 10, 10K, 10M */ size = conv_str_size(lp_parm_const_string(SNUM(handle->conn), MODULE, fext, NULL)); if (size <= 0) { /* No need to preallocate this file. */ goto normal_open; } fd = SMB_VFS_NEXT_OPEN(handle, fname, fsp, flags, mode); if (fd < 0) { return fd; } /* Prellocate only if the file is being created or replaced. Note that * Samba won't ever pass down O_TRUNC, which is why we have to handle * truncate calls specially. */ if ((flags & O_CREAT) || (flags & O_TRUNC)) { SMB_OFF_T * psize; psize = VFS_ADD_FSP_EXTENSION(handle, fsp, SMB_OFF_T); if (psize == NULL || *psize == -1) { return fd; } DEBUG(module_debug, ("%s: preallocating %s (fd=%d) to %lld bytes\n", MODULE, fname, fd, (long long)size)); *psize = size; if (preallocate_space(fd, 0, *psize) < 0) { VFS_REMOVE_FSP_EXTENSION(handle, fsp); } } return fd; normal_open: /* We are not creating or replacing a file. Skip the * preallocation. */ DEBUG(module_debug, ("%s: skipping preallocation for %s\n", MODULE, fname)); return SMB_VFS_NEXT_OPEN(handle, fname, fsp, flags, mode); }