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

📄 socket.c

📁 读写Smart卡加解密接口的程序
💻 C
字号:
#include <errno.h>#include <fcntl.h>#include <stdio.h>#include <stdint.h>#include <stdlib.h>#include <string.h>#include <syslog.h>#include <sys/stat.h>#include <sys/socket.h>#include <sys/un.h>#include <unistd.h>#include "usbtoken.h"#define MSG_ERROR -1#define MSG_OK 0#define MSG_TRANSMIT 3#define MSG_LOCK 4#define MSG_UNLOCK 5char *socketpath;void socket_exit(){	if (socketpath) {		unlink(socketpath);		free(socketpath);	}}int socket_init(){	int rc;	struct sockaddr_un ua;	int ualen;	mode_t oldmask;	usbtoken.unixfd = socket(PF_UNIX, SOCK_STREAM, 0);	if (usbtoken.unixfd == -1) {		syslog(LOG_ERR,		       "socket_init: socket failed: %s, aborting!\n",		       strerror(errno));		return USBTOKEN_ERROR;	}	bzero(&ua, sizeof(ua));	ua.sun_family = AF_UNIX;	snprintf(ua.sun_path, sizeof(ua.sun_path), SOCKET, usbtoken.slot);	socketpath = strdup(ua.sun_path);	unlink(socketpath);	atexit(socket_exit);	ualen = sizeof(ua.sun_family) + strlen(ua.sun_path);	oldmask = umask(0);	rc = bind(usbtoken.unixfd, (struct sockaddr *) &ua, ualen);	umask(oldmask);	/* some error */	if (rc == -1) {		syslog(LOG_DEBUG,		       "socket_init: bind on %s failed: %s(%d), aborting!\n",		       ua.sun_path, strerror(errno), errno);		return USBTOKEN_ERROR;	}	rc = listen(usbtoken.unixfd, 1);	if (rc == -1) {		syslog(LOG_DEBUG,		       "socket_init: listen failed: %s(%d), aborting!\n",		       strerror(errno), errno);		return USBTOKEN_ERROR;	}	rc = fcntl(usbtoken.unixfd, F_SETFL, O_NONBLOCK);	if (rc == -1) {		syslog(LOG_DEBUG,		       "socket_init: fcntl failed: %s(%d), aborting!\n",		       strerror(errno), errno);		return USBTOKEN_ERROR;	}	return USBTOKEN_OK;}int socket_accept(){	int rc;	rc = accept(usbtoken.unixfd, NULL, 0);	if (rc == -1) {		syslog(LOG_ERR, "socket_accept: accept failed: %s(%d)",		       strerror(errno), errno);		return USBTOKEN_ERROR;	}	if (usbtoken.connfd) {		close(rc);		return USBTOKEN_OK;	}	usbtoken.connfd = rc;	rc = write(usbtoken.connfd, usbtoken.atr, usbtoken.atrlen);	if (rc == -1) {		syslog(LOG_ERR,		       "socket_accept: write failed: %s(%d)",		       strerror(errno), errno);		return USBTOKEN_ERROR;	}	return USBTOKEN_OK;}int socket_hangup(){	int rc;	rc = close(usbtoken.connfd);	usbtoken.connfd = 0;	return USBTOKEN_OK;}int unix_write(uint8_t msg, int size){	int rc;	rc = write(usbtoken.connfd, &msg, size);	if (rc == -1) {		syslog(LOG_ERR, "unix_write: write failed: %s(%d)",		       strerror(errno), errno);		return USBTOKEN_ERROR;	}	return USBTOKEN_OK;}int socket_xmit(){	uint8_t buf_read[1024];	int rc, len_read;	rc = read(usbtoken.connfd, buf_read, sizeof(buf_read));	if (rc == -1) {		syslog(LOG_ERR, "socket_xmit: read failed: %s(%d)",		       strerror(errno), errno);		return USBTOKEN_ERROR;	}	len_read = rc;	if (buf_read[0] == MSG_TRANSMIT) {		uint8_t buf_write[1024];		int len_write;		len_write = sizeof(buf_write) - 1;		rc = t1_process(&buf_read[1], len_read - 1,				&buf_write[1], &len_write);		if (rc != USBTOKEN_OK)			return rc;		buf_write[0] = MSG_TRANSMIT;		rc = write(usbtoken.connfd, buf_write, len_write + 1);		if (rc == -1) {			syslog(LOG_ERR,			       "socket_xmit: write failed: %s(%d)",			       strerror(errno), errno);			return USBTOKEN_ERROR;		}		return USBTOKEN_OK;	}	/* all other commands are single byte commands */	if (len_read != 1) {		syslog(LOG_ERR, "socket_xmit: recv returned: %d",		       len_read);		return USBTOKEN_ERROR;	}	if (buf_read[0] == MSG_LOCK) {		return unix_write(MSG_OK, 1);	}	if (buf_read[0] == MSG_UNLOCK) {		return unix_write(MSG_OK, 1);	}	return unix_write(MSG_ERROR, 1);}

⌨️ 快捷键说明

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