📄 request.c
字号:
#include "calld.h"
int /* return 0 if OK, -1 on error */
request(Client *cliptr)
{
pid_t pid;
errmsg[0] = 0;
/* position where this client left off last (or rewind) */
sys_posn(cliptr->sysftell);
while ( (cliptr->sysftell = sys_next(&systems)) >= 0) {
if (strcmp(cliptr->sysname, systems.name) == 0) {
/* system match */
/* if client specified a speed, it must match too */
if (cliptr->speed[0] != 0 &&
strcmp(cliptr->speed, systems.class) != 0)
continue; /* speeds don't match */
DEBUG("trying sys: %s, %s, %s, %s", systems.name,
systems.type, systems.class, systems.phone);
cliptr->foundone++;
if (dev_find(&devices, &systems) < 0)
break;
DEBUG("trying dev: %s, %s, %s, %s", devices.type,
devices.line, devices.class, devices.dialer);
if ( (pid = is_locked(devices.line)) != 0) {
sprintf(errmsg, "device `%s' already locked by pid %d\n",
devices.line, pid);
continue; /* look for another entry in Systems file */
}
/* We've found a device that's not locked.
fork() a child to to the actual dialing. */
TELL_WAIT();
if ( (cliptr->pid = fork()) < 0)
log_sys("fork error");
else if (cliptr->pid == 0) { /* child */
WAIT_PARENT(); /* let parent set lock */
child_dial(cliptr); /* never returns */
}
/* parent */
lock_set(devices.line, cliptr->pid);
/* let child resume, now that lock is set */
TELL_CHILD(cliptr->pid);
return(0); /* we've started a child */
}
}
/* reached EOF on Systems file */
if (cliptr->foundone == 0)
sprintf(errmsg, "system `%s' not found\n", cliptr->sysname);
else if (errmsg[0] == 0)
sprintf(errmsg, "unable to connect to system `%s'\n",
cliptr->sysname);
return(-1); /* also, cliptr->sysftell is -1 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -