💾 Archived View for gmi.noulin.net › gitRepositories › tuyau › file › makeHeader.c.gmi captured on 2024-08-18 at 18:56:01. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2023-01-29)
-=-=-=-=-=-=-
makeHeader.c (2483B)
1 #include "libsheepyObject.h" 2 #include "shpPackages/short/short.h" 3 4 /* 5 packet structures: 6 0 - send file 7 u8 command = 0 8 u8 token[8] 9 u16 filenameLength 10 <filename> 11 u16 filemode 12 u16 pathLength 13 <path> 14 u64 filesize 15 <filedata> 16 1 - mkdir 17 u8 command = 0 18 u8 token[8] 19 u16 filemode 20 u16 pathLength 21 <path> 22 2 - download/receive files 23 u8 command = 0 24 u8 token[8] 25 u16 pathLength 26 <path> 27 */ 28 29 void makeHeader(u8 *buf, u32 *bufip, u8 command, smallDictt *svrInfo, char *sendFile, char *destPath, u64 **filesize) { 30 31 // command 32 // token 33 // file name max 8k 34 // file mode 35 // dest path 36 37 lv(sendFile); 38 lv(destPath); 39 40 // command 41 buf[0] = command; 42 // token 43 if (svrInfo) 44 memcpy(buf + 1, $(svrInfo, "token"), 8); 45 else 46 // used for downloading files from server to client 47 pError0(zeroBuf(buf + 1, 8)); 48 49 u32 bufi = 0; 50 if (command == 0) { 51 // send file 52 // file name max 8k 53 u16 *filenameLength = (u16*)(buf + 9); 54 char *filename = basename(sendFile); 55 *filenameLength = lenG(filename); 56 memcpy(buf + 11, filename, lenG(filename)); 57 bufi = 11 + lenG(filename); 58 // file mode 59 u16 *filemode = (u16*)(buf + bufi); 60 struct stat st; 61 if(stat(sendFile, &st) != 0){ 62 logE("Can't access %s", sendFile); 63 XFailure; 64 } 65 *filemode = st.st_mode & 0xFFF; 66 bufi += 2; 67 // dest path 68 u16 *pathLength = (u16*)(buf + bufi); 69 *pathLength = lenG(destPath); 70 bufi += 2; 71 if (destPath) { 72 memcpy(buf + bufi, destPath, *pathLength); 73 bufi += *pathLength; 74 } 75 // file size 76 *filesize = (u64*)(buf + bufi); 77 **filesize = fileSizeG(sendFile); 78 bufi += 8; 79 } 80 elif (command == 1) { 81 // mkdir 82 u16 *filemode = (u16*)(buf + 9); 83 struct stat st; 84 if(stat(sendFile, &st) != 0){ 85 logE("Can't access %s", sendFile); 86 XFailure; 87 } 88 *filemode = st.st_mode & 0xFFF; 89 // dest path 90 u16 *pathLength = (u16*)(buf + 11); 91 *pathLength = lenG(destPath); 92 memcpy(buf + 13, destPath, *pathLength); 93 bufi = 13 + lenG(destPath); 94 } 95 elif (command == 2) { 96 // download/receive files 97 // path in server 98 u16 *pathLength = (u16*)(buf + 9); 99 *pathLength = lenG(destPath); 100 memcpy(buf + 11, destPath, *pathLength); 101 bufi = 11 + lenG(destPath); 102 } 103 104 *bufip = bufi; 105 } 106 // vim: set expandtab ts=2 sw=2: