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

📄 request.c

📁 unix高级编程源代码.<<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 + -