A
Hallo zusammen!
Erst mal sorry, aber ich muss ein kleines bisschen ausholen.
Und das Thema ist leider teilweise schon sehr speziell...
Meine Vorkenntnisse: C hab ich vor einigen Jahren mal gelernt, bin aber momentan eigentlich fitter in C#, VBA und ABAP. Und speziell mit ANSI C unter Linux habe ich bisher leider noch gar keine Erfahrung.
Ich habe bei mir zuhause einen Fileserver mit OpenSuSE 11.1 und Samba laufen.
Nun wollte ich für bestimmte Shares eine Größenbeschränkung haben, aber quota kann ich nicht verwenden.
Denn Quota kann ja nur Kontingente pro Device und User/Gruppe verwalten, und nicht per Verzeichnis.
Außerdem stört es mich ein wenig, dass unter Windows in den Eigenschaften des gemappten Netzlaufwerks "falsche" Angaben über den belegten Platz stehen.
Dann bin ich auf Samba VFS Objects gestoßen, mit denen man ja alle möglichen Erweiterungen für Samba realisieren kann. Also will ich mir so eine Erweiterung basteln, die Folgendes realisiert:
- Korrekte Anzeige des belegten Speicherplatzes (nur die Größe des freigegebenen Verzeichnisses soll angezeigt werden, nicht die des kompletten Device)
- Größenbeschränkung per Parameter in der smb.conf
Ich hab mich also mal ein bisschen eingearbeitet, aber leider ist das doch etwas komplizierter als gedacht...
Den freien Platz in kB bekomme ich schon mal angezeigt (=disk_free), allerdings stimmen die Werte für bsize, dsize und dfree hinten und vorne nicht.
Edit: Die Werte stimmen, man darf halt die * nicht vergessen (war auch schon spät...)
Hier mal mein Sourcecode, den ich mir bisher mühsam zusammengeklau(b)t habe:
#include "includes.h"
static SMB_BIG_UINT share_quota_disksize(vfs_handle_struct *handle)
{
SMB_BIG_UINT disksize;
disksize = conv_str_size(lp_parm_const_string(SNUM(handle->conn),
"share_quota", "disksize", NULL));
DEBUG(1, ("share_quota: disksize = %lu\n", (long unsigned int)disksize));
return disksize;
}
static SMB_BIG_UINT share_quota_disk_free(vfs_handle_struct *handle, const char *path,
bool small_query, SMB_BIG_UINT *bsize,
SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize)
{
SMB_BIG_UINT u_df;
u_df = SMB_VFS_NEXT_DISK_FREE(handle, path, small_query, bsize, dfree, dsize);
char *p_realpath = NULL;
p_realpath = SMB_VFS_NEXT_REALPATH(handle, path, NULL);
DEBUG(1, ("share_quota: realpath = %s\n", p_realpath));
DEBUG(1, ("share_quota: bsize = %lu\n", (long unsigned int)*bsize));
DEBUG(1, ("share_quota: dsize = %lu\n", (long unsigned int)*dsize));
DEBUG(1, ("share_quota: dfree = %lu\n", (long unsigned int)*dfree));
DEBUG(1, ("share_quota: disk_free = %lu\n", (long unsigned int)u_df));
SAFE_FREE(p_realpath);
return u_df;
}
/* VFS operations structure */
static vfs_op_tuple share_quota_ops[] = {
/* Disk operations */
{SMB_VFS_OP(share_quota_disk_free), SMB_VFS_OP_DISK_FREE, SMB_VFS_LAYER_TRANSPARENT},
{NULL, SMB_VFS_OP_NOOP, SMB_VFS_LAYER_NOOP}
};
NTSTATUS init_samba_module(void)
{
return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "share_quota", share_quota_ops);
}
Nun zu meinem Problem: Wie komme ich (vielleicht mit vordefinierten SAMBA-Calls) an die wirkliche Größe des Ordners p_realpath?
Hat irgendwer Erfahrungen mit VFS Objects, oder sonst einen Tipp, wie ich weiterkomme?
MfG