The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"1с+samba - очень срочно!"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы OpenNET: Виртуальная конференция (Public)
Изначальное сообщение [Проследить за развитием треда]

"1с+samba - очень срочно!"
Сообщение от Rome emailИскать по авторуВ закладки on 13-Фев-02, 15:00  (MSK)
народ! помогите пожалуйста. надо прикрутить 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
}

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "RE: 1с+samba - очень срочно!"
Сообщение от BartSimpson emailИскать по авторуВ закладки on 13-Фев-02, 15:12  (MSK)
>народ! помогите пожалуйста. надо прикрутить 1с7.7

Ты объясни что хочешь, нихрена не понял. Для начала скачай 2.2.3а, потом напиши что надо.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "RE: 1с+samba - очень срочно!"
Сообщение от Rome emailИскать по авторуВ закладки on 13-Фев-02, 15:36  (MSK)
>Ты объясни что хочешь, нихрена не
>понял. Для начала скачай 2.2.3а,
>потом напиши что надо.

Сейчас стоит самба 2.0.7. Нужно, чтобы на ней лежали 1с-овские базы. Там возникает проблема с общим доступом и lock-ами. Чтобы от нее(проблемы) избавиьтся надо подправить исходники. Вот я и спрашиваю где именно. На эту тему есть заметка здесь: https://www.opennet.ru/base/net/1csamba.txt.html
но я в Си - бум-бук.


А что в 2.2.3 такой проблемы не возникает?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "RE: 1с+samba - очень срочно!"
Сообщение от BartSimpson emailИскать по авторуВ закладки on 13-Фев-02, 15:48  (MSK)
>А что в 2.2.3 такой проблемы
>не возникает?


Ты в тех заметках год смотрел?
КРИЧУ ТЕБЕ: СКАЧИВАЙ 2.2.3A, ДАЛЬШЕ БУДЕМ ПОСМОТРЕТЬ.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "RE: 1с+samba - очень срочно!"
Сообщение от BartSimpson emailИскать по авторуВ закладки on 13-Фев-02, 15:49  (MSK)
>>А что в 2.2.3 такой проблемы
>>не возникает?
>
>
>Ты в тех заметках год смотрел?
>
>КРИЧУ ТЕБЕ: СКАЧИВАЙ 2.2.3A, ДАЛЬШЕ БУДЕМ
>ПОСМОТРЕТЬ.

ЗАБЫЛ СПРОСИТЬ, 1С ЧТО?
КАКFЯ ВЕРСИЯ И ЧТО ЗА ОСЬ?

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру