📄 public.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 + -