static int cmd_vfs_ls(struct vmm_chardev *cdev, const char *path) { char type[11]; char dpath[VFS_MAX_PATH]; int fd, rc, plen, total_ent; struct vmm_timeinfo ti; struct stat st; struct dirent d; fd = vfs_opendir(path); if (fd < 0) { vmm_cprintf(cdev, "Failed to opendir %s\n", path); return fd; } if ((plen = strlcpy(dpath, path, sizeof(dpath))) >= sizeof(dpath)) { rc = VMM_EOVERFLOW; goto closedir_fail; } if (path[plen-1] != '/') { if ((plen = strlcat(dpath, "/", sizeof(dpath))) >= sizeof(dpath)) { rc = VMM_EOVERFLOW; goto closedir_fail; } } total_ent = 0; while (!vfs_readdir(fd, &d)) { dpath[plen] = '\0'; if (strlcat(dpath, d.d_name, sizeof(dpath)) >= sizeof(dpath)) { rc = VMM_EOVERFLOW; goto closedir_fail; } rc = vfs_stat(dpath, &st); if (rc) { vmm_cprintf(cdev, "Failed to get %s stat\n", dpath); goto closedir_fail; } strcpy(type, "----------"); if (st.st_mode & S_IFDIR) { type[0]= 'd'; } else if (st.st_mode & S_IFCHR) { type[0]= 'c'; } else if (st.st_mode & S_IFBLK) { type[0]= 'b'; } else if (st.st_mode & S_IFLNK) { type[0]= 'l'; } if (st.st_mode & S_IRUSR) { type[1] = 'r'; } if (st.st_mode & S_IWUSR) { type[2] = 'w'; } if (st.st_mode & S_IXUSR) { type[3] = 'x'; } if (st.st_mode & S_IRGRP) { type[4] = 'r'; } if (st.st_mode & S_IWGRP) { type[5] = 'w'; } if (st.st_mode & S_IXGRP) { type[6] = 'x'; } if (st.st_mode & S_IROTH) { type[7] = 'r'; } if (st.st_mode & S_IWOTH) { type[8] = 'w'; } if (st.st_mode & S_IXOTH) { type[9] = 'x'; } vmm_cprintf(cdev, "%10s ", type); vmm_cprintf(cdev, "%10ll ", st.st_size); vmm_wallclock_mkinfo(st.st_mtime, 0, &ti); switch (ti.tm_mon) { case 0: vmm_cprintf(cdev, "%s ", "Jan"); break; case 1: vmm_cprintf(cdev, "%s ", "Feb"); break; case 2: vmm_cprintf(cdev, "%s ", "Mar"); break; case 3: vmm_cprintf(cdev, "%s ", "Apr"); break; case 4: vmm_cprintf(cdev, "%s ", "May"); break; case 5: vmm_cprintf(cdev, "%s ", "Jun"); break; case 6: vmm_cprintf(cdev, "%s ", "Jul"); break; case 7: vmm_cprintf(cdev, "%s ", "Aug"); break; case 8: vmm_cprintf(cdev, "%s ", "Sep"); break; case 9: vmm_cprintf(cdev, "%s ", "Oct"); break; case 10: vmm_cprintf(cdev, "%s ", "Nov"); break; case 11: vmm_cprintf(cdev, "%s ", "Dec"); break; default: break; }; vmm_cprintf(cdev, "%02d %d %02d:%02d:%02d ", ti.tm_mday, ti.tm_year + 1900, ti.tm_hour, ti.tm_min, ti.tm_sec); if (type[0] == 'd') vmm_cprintf(cdev, "%s/\n", d.d_name); else vmm_cprintf(cdev, "%s\n", d.d_name); total_ent++; } vmm_cprintf(cdev, "total %d\n", total_ent); rc = vfs_closedir(fd); if (rc) { vmm_cprintf(cdev, "Failed to closedir %s\n", path); return rc; } return VMM_OK; closedir_fail: vfs_closedir(fd); return rc; }
static int cmd_wallclock_get_time(struct vmm_chardev *cdev) { int rc; struct vmm_timeinfo ti; struct vmm_timeval tv; struct vmm_timezone tz; rc = vmm_wallclock_get_timeofday(&tv, &tz); if (rc) { vmm_cprintf(cdev, "Error: get_time failed\n"); return rc; } vmm_wallclock_mkinfo(tv.tv_sec, 0, &ti); switch (ti.tm_wday) { case 0: vmm_cprintf(cdev, "%s ", "Sun"); break; case 1: vmm_cprintf(cdev, "%s ", "Mon"); break; case 2: vmm_cprintf(cdev, "%s ", "Tue"); break; case 3: vmm_cprintf(cdev, "%s ", "Wed"); break; case 4: vmm_cprintf(cdev, "%s ", "Thu"); break; case 5: vmm_cprintf(cdev, "%s ", "Fri"); break; case 6: vmm_cprintf(cdev, "%s ", "Sat"); break; default: vmm_cprintf(cdev, "Error: Invalid day of week\n"); }; switch (ti.tm_mon) { case 0: vmm_cprintf(cdev, "%s ", "Jan"); break; case 1: vmm_cprintf(cdev, "%s ", "Feb"); break; case 2: vmm_cprintf(cdev, "%s ", "Mar"); break; case 3: vmm_cprintf(cdev, "%s ", "Apr"); break; case 4: vmm_cprintf(cdev, "%s ", "May"); break; case 5: vmm_cprintf(cdev, "%s ", "Jun"); break; case 6: vmm_cprintf(cdev, "%s ", "Jul"); break; case 7: vmm_cprintf(cdev, "%s ", "Aug"); break; case 8: vmm_cprintf(cdev, "%s ", "Sep"); break; case 9: vmm_cprintf(cdev, "%s ", "Oct"); break; case 10: vmm_cprintf(cdev, "%s ", "Nov"); break; case 11: vmm_cprintf(cdev, "%s ", "Dec"); break; default: vmm_cprintf(cdev, "Error: Invalid month\n"); }; vmm_cprintf(cdev, "%2d %d:%d:%d ", ti.tm_mday, ti.tm_hour, ti.tm_min, ti.tm_sec); if (tz.tz_minuteswest == 0) { vmm_cprintf(cdev, "UTC "); } else if (tz.tz_minuteswest < 0) { tz.tz_minuteswest *= -1; vmm_cprintf(cdev, "UTC-%d:%d ", tz.tz_minuteswest / 60, tz.tz_minuteswest % 60); } else { vmm_cprintf(cdev, "UTC+%d:%d ", tz.tz_minuteswest / 60, tz.tz_minuteswest % 60); } vmm_cprintf(cdev, "%ld", ti.tm_year + 1900); vmm_cprintf(cdev, "\n"); return VMM_OK; }