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

📄 public.c

📁 福建博洋教育C/C++软件项目实战Linux网络编程阶段:FTP服务器开发
💻 C
字号:
#include <unistd.h>
#include <crypt.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <shadow.h>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <net/if_arp.h>
#include <net/if.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <arpa/inet.h>

#include "Public.h"

void *sMemory				  = NULL;
struct state_struct *ftpState = NULL;
struct loginstat_struct State;
int shmkey = 54353453;
int semkey = 85673566;
int sid;

/* 写入数据 */
int Read(int fd, char *buf, int size)
{
	int readNum = 0;
	int index = 0;

	for (;;)
	{
		readNum = read(fd, buf+index, size);

		if (readNum < 0)
		{
			if (errno == EINTR)
				continue;
			return readNum;
		}
		else if (readNum == 0)
			return readNum;

		index+=readNum;
		size -=readNum;

		if (size == 0)
			return index;
	}
}

/* 读取数据 */
int Write(int fd, char *buf, int size)
{
	int writeNum = 0;
	int index = 0;

	for (;;)
	{
		writeNum = write(fd, buf+index, size);

		if (writeNum < 0)
		{
			if (errno == EINTR)
				continue;
			return writeNum;

		}
		else if (writeNum == 0)
			return writeNum;
		
		index+=writeNum;
		size -=writeNum;

		if (size == 0)
			return index;
	}
}

/* 读取但不清流 */
int ReadNoDel(int fd, char *result, int maxLen)
{
	int readNum;

	for (;;)
	{
		readNum = recv(fd, result, maxLen, MSG_PEEK);
		
		if (readNum < 0)
			if (errno == EINTR)
				continue;
			else
				return -1;
		else if (readNum == 0)
			return 0;

		return readNum;
	}
}

/* 读取一行 */
int ReadLine(int fd, char *result, int maxLen)
{
	int readNum, i;
	int readLeft = maxLen;
	char *tmp = result;

	for (;;)
	{
		readNum = ReadNoDel(fd, tmp, readLeft);
		if (readNum < 0)
			return -1;
		else if (readNum == 0)
			return 0;

		for (i=0; i<readNum; i++)
		{
			if (*(tmp+i) == '\n')
			{
				Read(fd, result, i+1);
				while(*result++ != '\n');
				*result = '\0';

				return readNum;
			}
		}

		readLeft -= readNum;
		int readNum2 = Read(fd, tmp, readNum);
		if (readNum2 != readNum)
		{
			fprintf(stderr, "read error");
			exit(-1);
		}
		tmp += readNum;
	}

	return 0;
}

/* 去除换行和回车 */
void Rmlfcr(char *str)
{
	int len = strlen(str);
	str+=len-1;
	while (*str == '\r' || *str == '\n')
	{
		*str = '\0';
		str--;
	}
}

/* 得到命令 */
int GetCommand(char **buf, char **cmd)
{
	char *tmp;

	Rmlfcr(*buf);
	if ((tmp = strchr(*buf, ' ')) != NULL)
	{
		*tmp = '\0';
		*cmd = *buf;
		*buf = tmp+1;
		while (*(*buf) == ' ')(*buf)++;
	}
	else
		strcpy(*cmd, *buf);
	return 1;
}

/* 用户 */
int GetUser(char *user, struct passwd **userInfo)
{
	if (strlen(user) == 0)
		return USER_EMPTY;
	if ((*userInfo = getpwnam(user)) == NULL)
		return NO_THIS_USER;
	return USER_OK;
};

/* 密码 */
int CheckPass(char *user, char *pwd)
{
	struct spwd *passInfo;
	if ((passInfo = getspnam(user)) == NULL)
		return GET_PASSWORD_FAIL;

	char salt[13];
	memset(salt, 0, sizeof(salt));
	strncpy(salt, passInfo->sp_pwdp, 12);

	char *pw = crypt((const char *)pwd, (const char *)salt);
	if (strcmp(pw, passInfo->sp_pwdp) != 0)
		return PASSWORD_ERROR;

	return PASS_OK;
}

/* 得到当前路径 */
int GetHomeDir(char *user, char *path)
{
	struct passwd *uInfo;

	if ((uInfo = getpwnam(user)) == NULL)
	{
		strcpy(path, NULL);
		return -1;
	}

	strcpy(path, uInfo->pw_dir);
	return 0;
}

/* 得到ip和端口 */
int GetIpPort(char *text, char *ip, int *port)
{
	int i = 0, hiPort, loPort;
	char *tmp = text;
	char *hi8;
	char *lo8;

	while(*text)
	{
		if (*text == ',')
		{
			*text = '.';
			i++;
		}
		if (i == 4)
		{
			*text = '\0';
			text++;
			break;
		}

		text++;
	}

	hi8 = text;
	*(lo8 = strchr(hi8, ',')) = '\0';
	lo8++;

	hiPort = atoi(hi8);
	loPort = atoi(lo8);

	strcpy(ip, tmp);
	*port = hiPort*256+loPort;

	return 0;
}

/* ip和端口 */
int PutIpPort(char *sIp, char *ip, int port)
{
	int hi8, lo8;
	char *tip = ip;

	while (*tip)
	{
		if (*tip == '.')
			*tip = ',';
		tip++;
	}

	hi8 = port >> 8;
	lo8 = port & 0XFF;

	sprintf(sIp, "%s,%d,%d", ip, hi8, lo8);
}

/* 去除右空格 */
int RTrim(char *str)
{
	int len = strlen(str);
	str+=len-1;

	while(*str == ' ')*str-- = '\0';
}

/* 读取配置文件 */
int GetConfig(char *flag, char *value)
{
	char ibuf[128];
	char *buf = ibuf;
	char *findStr = NULL;
	char *result = NULL;
	FILE *fp = NULL;

	if ((fp = fopen("/etc/iFtp.conf", "r")) == NULL)
		fp = fopen("iFtp.conf", "r");

	memset(ibuf, 0, sizeof(ibuf));
	while (!feof(fp) && fgets(buf, 125, fp))
	{
		if (*buf == '#')
			continue;

		if ((findStr = strstr(buf, flag)) == NULL)
			continue;

		if ((result = strchr(findStr, ' ')) != NULL || (result = strchr(findStr, '=')) != NULL)
		{
			result++;
			break;
		}
		else
			return -1;
	}

	if (result == NULL)
		return -1;

	RTrim(result);
	strcpy(value, result);
	
	return 0;
}

/* 得到本地IP */
int GetLocalIp(char *ip)
{
	int sockfd;
	if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
	{
		perror( "socket" );
		return -1;
	}
	struct ifreq req;
	struct sockaddr_in *host;

	bzero(&req, sizeof(struct ifreq));
	strcpy(req.ifr_name, "eth0");

	ioctl(sockfd, SIOCGIFADDR, &req);
	host = (struct sockaddr_in*)&req.ifr_addr;
	strcpy(ip, inet_ntoa(host->sin_addr));

	close(sockfd);
	return 0;
}

/* 初始化信号量 */
int initSem()
{
	union semun sem_union;
	int semid = semget(semkey, 1, 0666);

	sem_union.val = 1;
	if (semctl(semid, 0, SETVAL, sem_union) == -1)
		return 1;
	return 0;
}

/* P操作 */
int p(int sid)
{
	struct sembuf sem;

	sem.sem_num = 0;
	sem.sem_op  = -1;
	sem.sem_flg = SEM_UNDO;

	if (semop(sid, &sem, 1) == -1);
}

/* V操作 */
int v(int sid)
{
	struct sembuf sem;

	sem.sem_num = 0;
	sem.sem_op  = +1;
	sem.sem_flg = SEM_UNDO;

	if (semop(sid, &sem, 1) == -1);
}

/* 读取配置信息 */
int GetSysConfig()
{
	char result[MAX_BUF_SIZE];

	memset(result, 0, sizeof(result));
	GetConfig("UP_MAX", result);
	int maxU = atoi(result);
	if (maxU == -1)
		maxU = 100;
	State.MAX_UP = maxU;

	memset(result, 0, sizeof(result));
	GetConfig("DW_MAX", result);
	int maxD = atoi(result);
	if (maxD == -1)
		maxD = 100;
	State.MAX_DW = maxD;

	memset(result, 0, sizeof(result));
	GetConfig("anonymous", result);
	if (strstr(result, "YES") == NULL)
		State.anologin = 0;
	else
		State.anologin = 1;

	memset(result, 0, sizeof(result));
	GetConfig("anon_upload", result);
	if (strstr(result, "YES") ==  NULL)
		State.anoupload = 0;
	else
		State.anoupload = 1;

	memset(result, 0, sizeof(result));
	GetConfig("anon_download", result);
	if (strstr(result, "YES") ==  NULL)
		State.anodwload = 0;
	else
		State.anodwload = 1;

	memset(result, 0, sizeof(result));
	GetConfig("MAX_TIME", result);
	int maxT = atoi(result);
	if (maxT == -1)
		maxT = 60;
	State.MAX_TIME = maxT;

	return 0;
}

/* 字符串大写 */
char *strupp(char *str)
{
	char *tmp = str;
	while (*tmp != '\0')
	{
		if (*tmp >= 'a' && *tmp <= 'z')
			*tmp -= 32;
		tmp++;
	}

	return str;
}

⌨️ 快捷键说明

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