⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 request.c

📁 unix环境高级编程的源代码
💻 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 + -