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

📄 posix-factotum.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <sys/socket.h>#include <sys/un.h>#include <ctype.h>#include <pwd.h>#include <libc.h>#include <auth.h>#include <fcall.h>#include <authsrv.h>#include <libsec.h>#include "drawterm.h"#undef socket#undef connect#undef getenv#undef accesschar*getuser(void){	static char user[64];	struct passwd *pw;	pw = getpwuid(getuid());	if(pw == nil)		return "none";	strecpy(user, user+sizeof user, pw->pw_name);	return user;}/* * Absent other hints, it works reasonably well to use * the X11 display name as the name space identifier. * This is how sam's B has worked since the early days. * Since most programs using name spaces are also using X, * this still seems reasonable.  Terminal-only sessions * can set $NAMESPACE. */static char*nsfromdisplay(void){	char *disp, *p;	if((disp = getenv("DISPLAY")) == nil){		werrstr("$DISPLAY not set");		return nil;	}	/* canonicalize: xxx:0.0 => xxx:0 */	p = strrchr(disp, ':');	if(p){		p++;		while(isdigit((uchar)*p))			p++;		if(strcmp(p, ".0") == 0)			*p = 0;	}	return smprint("/tmp/ns.%s.%s", getuser(), disp);}char*getns(void){	char *ns;	ns = getenv("NAMESPACE");	if(ns == nil)		ns = nsfromdisplay();	if(ns == nil){		werrstr("$NAMESPACE not set, %r");		return nil;	}	return ns;}intdialfactotum(void){	int fd;	struct sockaddr_un su;	char *name;		name = smprint("%s/factotum", getns());	if(name == nil || access(name, 0) < 0)		return -1;	memset(&su, 0, sizeof su);	su.sun_family = AF_UNIX;	if(strlen(name)+1 > sizeof su.sun_path){		werrstr("socket name too long");		return -1;	}	strcpy(su.sun_path, name);	if((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){		werrstr("socket: %r");		return -1;	}	if(connect(fd, (struct sockaddr*)&su, sizeof su) < 0){		werrstr("connect %s: %r", name);		close(fd);		return -1;	}	return lfdfd(fd);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -