LINUX.ORG.RU
ФорумAdmin

Срочно: 1с!!


0

0

народ! помогите пожалуйста ламеру. надо прикрутить 1с7.7 к самбе 2.0.7. знаю, что надо править в исходниках. но пожалуйста ткните носом! с С большие проблемы. хотелось бы конкретных целеуказаний.

Вычитал следующее:авторы
предлагают там два варианта куска кода, выделенные директивами условной компиляции. Так вот тот вариант, что выбран по умолчанию - не работает нормально. адо выбрать второй - и все проблемы исчезают.

Вот листинг процедурки, которую нужно подправить:

BOOL fcntl_lock(int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type)
{
#if HAVE_FCNTL_LOCK
SMB_STRUCT_FLOCK lock;
int ret;
#if defined(LARGE_SMB_OFF_T)
/*
* In the 64 bit locking case we store the original
* values in case we have to map to a 32 bit lock on
* a filesystem that doesn't support 64 bit locks.
*/
SMB_OFF_T orig_offset = offset;
SMB_OFF_T orig_count = count;
#endif /* LARGE_SMB_OFF_T */

if(lp_ole_locking_compat()) {
SMB_OFF_T mask2= ((SMB_OFF_T)0x3) << (SMB_OFF_T_BITS-4);
SMB_OFF_T mask = (mask2<<2);

/* make sure the count is reasonable, we might kill the lockd otherwise */
count &= ~mask;

/* the offset is often strange - remove 2 of its bits if either of
the top two bits are set. Shift the top ones by two bits. This
still allows OLE2 apps to operate, but should stop lockd from
dieing */
if ((offset & mask) != 0)
offset = (offset & ~mask) | (((offset & mask) >> 2) & mask2);
} else {
SMB_OFF_T mask2 = ((SMB_OFF_T)0x4) << (SMB_OFF_T_BITS-4);
SMB_OFF_T mask = (mask2<<1);
SMB_OFF_T neg_mask = ~mask;

/* interpret negative counts as large numbers */
if (count < 0)
count &= ~mask;

/* no negative offsets */
if(offset < 0)
offset &= ~mask;

/* count + offset must be in range */
while ((offset < 0 || (offset + count < 0)) && mask)
{
offset &= ~mask;
mask = ((mask >> 1) & neg_mask);
}
}

DEBUG(8,("fcntl_lock %d %d %.0f %.0f %d\n",fd,op,(double)offset,(double)count,type));

lock.l_type = type;
lock.l_whence = SEEK_SET;
lock.l_start = offset;
lock.l_len = count;
lock.l_pid = 0;

errno = 0;

ret = fcntl(fd,op,&lock);
if (errno == EFBIG)
{
if( DEBUGLVL( 0 ))
{
dbgtext("fcntl_lock: WARNING: lock request at offset %.0f, length %.0f returned\n", (double)offset,(double)count);
dbgtext("a 'file too large' error. This can happen when using 64 bit lock offsets\n");
dbgtext("on 32 bit NFS mounted file systems. Retrying with 32 bit truncated length.\n");
}
/* 32 bit NFS file system, retry with smaller offset */
errno = 0;
lock.l_len = count & 0x7fffffff;
ret = fcntl(fd,op,&lock);
}

if (errno != 0)
DEBUG(3,("fcntl lock gave errno %d (%s)\n",errno,strerror(errno)));

/* a lock query */
if (op == SMB_F_GETLK)
{
if ((ret != -1) &&
(lock.l_type != F_UNLCK) &&
(lock.l_pid != 0) &&
(lock.l_pid != getpid()))
{
DEBUG(3,("fd %d is locked by pid %d\n",fd,(int)lock.l_pid));
return(True);
}

/* it must be not locked or locked by me */
return(False);
}

/* a lock set or unset */
if (ret == -1)
{
DEBUG(3,("lock failed at offset %.0f count %.0f op %d type %d (%s)\n",
(double)offset,(double)count,op,type,strerror(errno)));

/* perhaps it doesn't support this sort of locking?? */
if (errno == EINVAL)
{

#if defined(LARGE_SMB_OFF_T)
{
/*
* Ok - if we get here then we have a 64 bit lock request
* that has returned EINVAL. Try and map to 31 bits for offset
* and length and try again. This may happen if a filesystem
* doesn't support 64 bit offsets (efs/ufs) although the underlying
* OS does.
*/
uint32 off_low = (orig_offset & 0xFFFFFFFF);
uint32 off_high = ((orig_offset >> 32) & 0xFFFFFFFF);

lock.l_len = (orig_count & 0x7FFFFFFF);
lock.l_start = (SMB_OFF_T)map_lock_offset(off_high, off_low);
ret = fcntl(fd,op,&lock);
if (ret == -1)
{
if (errno == EINVAL)
{
DEBUG(3,("locking not supported? returning True\n"));
return(True);
}
return False;
}
DEBUG(3,("64 -> 32 bit modified lock call successful\n"));
return True;
}
#else /* LARGE_SMB_OFF_T */
DEBUG(3,("locking not supported? returning True\n"));
return(True);
#endif /* LARGE_SMB_OFF_T */
}

return(False);
}

/* everything went OK */
DEBUG(8,("Lock call successful\n"));

return(True);
#else
return(False);
#endif
}

ткните носом ламера.
заранее спасибо!

anonymous

Какие конкретно проблеммы у тебя с 1С?? У меня уже сколько работает и всё нормально без правки кода... Всё настраивается в самом линуксе и самбе....

Boroda10
()
Ответ на: комментарий от Boroda10

Положил 1С каталоги с базой данных и программами на linux slackware под Samba.При запуске 11, или 12 пользователя тот отрубается с сообщениями в логах типа: recv failure for 4. Error = Connection reset by peer

dusse
()

ole locking compatibility = No
У меня потом все здорово заработало )))

Graveholder
()

ole locking compatibility = No это у тебя заработало на какой самбе?

anonymous
()
Ответ на: комментарий от dusse

Значит так: 1. пропиши в конфе самбы max open files = 30000 #Кол-во одновременно открытых файлов на один процесс демона самбы. 2. Там - же max smbd processes = 0 # Кол-во запускаемых демонов самбы не ограничено. 3. Закинь в файл file-max Значение 65356 или больше.... :-))) У меня ред хат 7.2 Так я закидываю скриптиком echo 65356> /proc/sys/fs/file-max

А насчёт compitability ...... Это помогало , но в ранних версиях самбы..... И ещё ядро не ниже 2.4.3 и выше.....

Удачи... У меня на такой конфигурации работает комплексная 7.7 до 10 машин.... Больше не пробовал....

Boroda10
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.