int main(const int argc, const char *argv[]) { int server_fd, client_fd; int read_size; short cmd_len; struct sockaddr addr; socklen_t alen; info_sys("backuprestore service start!"); if ((server_fd = srv_create_sk()) < 0) err_sys("create socket server error"); alen = sizeof(addr); info_sys("Server socket create successfully!"); while(1){ client_fd = accept(server_fd, (struct sockaddr*) &addr, &alen); if (client_fd < 0) { debug_sys("socket accept failed, please try again!"); continue; } info_sys("before excute"); while (1) { cmd_len = 0; if (readx(client_fd, &cmd_len, sizeof(cmd_len)) <= 0){ debug_sys("cmd length read fail"); break; } if (cmd_len < 1 || cmd_len > 2048){ debug_sys("cmd length is not right"); break; } if (readx(client_fd, &cmd, cmd_len) <= 0){ debug_sys("read cmd fail"); break; } cmd[cmd_len] = 0; if (excute(client_fd, cmd) < 0) break; } close(client_fd); } close(server_fd); info_sys("backuprestore service end!"); return EXIT_SUCCESS; }
int main(int argc, char *argv[]) { printf("sysconfig v%s %s/%s %s " __TIME__ " " __DATE__ "\n", PACKAGE_VERSION, CONFIG_PLATFORM, CONFIG_SRCARCH, CONFIG_ARCH); info_cpu(); info_sys(); linkmap_init(); linkmap_fini(); return 0; }
static int srv_create_sk() { int lsocket; info_sys("Get socket from Android env!"); lsocket = android_get_control_socket(SOCKET_PATH); if (lsocket < 0){ debug_sys("Failed to get socket from environment"); return -1; } if (listen(lsocket, QBACKLOG)) { debug_sys("Listen on socket failed"); return -1; } fcntl(lsocket, F_SETFD, FD_CLOEXEC); return lsocket; }
int change_folder_owner(char *pathSrc, uid_t userId , gid_t groupId) { DIR *pDir=NULL; char path[PATH_LENGTH]=""; struct dirent *ent = NULL;//目录属性 struct stat info; if((pDir = opendir(pathSrc)) == NULL) { return -1; } while(NULL !=(ent=readdir(pDir))) { if(strcmp(ent->d_name,"..")==0||strcmp(ent->d_name,".")==0) //遇到子目录'.'或父母录标记'..',继续 continue ; strcpy(path, pathSrc); stat(path, &info); // Error check omitted struct passwd *pw = getpwuid(info.st_uid); if(strcmp(pw->pw_name, "system") == 0){ info_sys("backuprestore uid = system!"); continue; } strcat(path,"/"); strcat(path,ent->d_name); chown(path, userId, groupId); if(4 == ent->d_type)//子目录 { change_folder_owner(path, userId, groupId); } } chown(pathSrc, userId, groupId); if(pDir != NULL) { closedir(pDir); } return 0; }
static int backup(char** args , char reply[REPLY_LEN]) { info_sys("call backup"); ALOGI("srcpath: %s; destpath: %s", args[0], args[1]); app_data_del(args[1]); // delete the file but the parent folder int ret = backupAppData(args[0], args[1]); if(ret >= 0){ struct stat selfstat; stat("/data/data/com.mediatek.backuprestore", &selfstat); struct passwd *pw = getpwuid(selfstat.st_uid); if (pw != NULL) { change_folder_owner(args[1], pw->pw_uid, pw->pw_gid); } return 1; } else { cleardir(args[1]); //if copy fail,then delete the copied file and return -1 return -1; } }