Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/procps/fuser.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/procps/fuser.c
r821 r1770 9 9 */ 10 10 11 #include "busybox.h" 12 #include <stdio.h> 13 #include <stdlib.h> 14 #include <unistd.h> 15 #include <string.h> 16 #include <limits.h> 17 #include <dirent.h> 18 #include <signal.h> 19 #include <sys/types.h> 20 #include <sys/ioctl.h> 21 #include <sys/stat.h> 22 #include <sys/socket.h> 23 #include <sys/sysmacros.h> 11 #include "libbb.h" 24 12 25 13 #define FUSER_PROC_DIR "/proc" … … 47 35 int opt = 0; 48 36 49 if(!(strlen(option))) return 0; 50 if(option[0] != '-') return 0; 37 if (!option[0]) 38 return 0; 39 if (option[0] != '-') 40 return 0; 51 41 ++option; 52 while(*option != '\0') { 53 if(*option == 'm') opt |= FUSER_OPT_MOUNT; 54 else if(*option == 'k') opt |= FUSER_OPT_KILL; 55 else if(*option == 's') opt |= FUSER_OPT_SILENT; 56 else if(*option == '6') opt |= FUSER_OPT_IP6; 57 else if(*option == '4') opt |= FUSER_OPT_IP4; 58 else { 59 bb_error_msg_and_die( 60 "Unsupported option '%c'", *option); 61 } 42 while (*option != '\0') { 43 if (*option == 'm') opt |= FUSER_OPT_MOUNT; 44 else if (*option == 'k') opt |= FUSER_OPT_KILL; 45 else if (*option == 's') opt |= FUSER_OPT_SILENT; 46 else if (*option == '6') opt |= FUSER_OPT_IP6; 47 else if (*option == '4') opt |= FUSER_OPT_IP4; 48 else 49 bb_error_msg_and_die("unsupported option '%c'", *option); 62 50 ++option; 63 51 } … … 69 57 { 70 58 struct stat f_stat; 71 if((stat(filename, &f_stat)) < 0) return 0; 59 if ((stat(filename, &f_stat)) < 0) 60 return 0; 72 61 *inode = f_stat.st_ino; 73 62 *dev = f_stat.st_dev; … … 81 70 82 71 if (fd >= 0 && (fstat(fd, &buf)) == 0) { 83 *dev = 72 *dev = buf.st_dev; 84 73 close(fd); 85 74 return 1; … … 93 82 char path[sizeof(FUSER_PROC_DIR)+12], tproto[5]; 94 83 95 if((sscanf(filename, "%d/%4s", port, tproto)) != 2) return 0; 96 sprintf(path, "%s/net/%s", FUSER_PROC_DIR, tproto); 97 if((access(path, R_OK)) != 0) return 0; 98 *proto = bb_xstrdup(tproto); 84 if ((sscanf(filename, "%d/%4s", port, tproto)) != 2) 85 return 0; 86 sprintf(path, FUSER_PROC_DIR "/net/%s", tproto); 87 if ((access(path, R_OK)) != 0) 88 return 0; 89 *proto = xstrdup(tproto); 99 90 return 1; 100 91 } … … 104 95 pid_list *curr = NULL, *last = NULL; 105 96 106 if(plist->pid == 0) plist->pid = pid; 97 if (plist->pid == 0) 98 plist->pid = pid; 107 99 curr = plist; 108 while(curr != NULL) { 109 if(curr->pid == pid) return 1; 100 while (curr != NULL) { 101 if (curr->pid == pid) 102 return 1; 110 103 last = curr; 111 104 curr = curr->next; 112 105 } 113 curr = x malloc(sizeof(pid_list));106 curr = xzalloc(sizeof(pid_list)); 114 107 last->next = curr; 115 108 curr->pid = pid; 116 curr->next = NULL;109 /*curr->next = NULL;*/ 117 110 return 1; 118 111 } … … 122 115 inode_list *curr = NULL, *last = NULL; 123 116 124 if (!ilist->inode && !ilist->dev) {117 if (!ilist->inode && !ilist->dev) { 125 118 ilist->dev = dev; 126 119 ilist->inode = inode; 127 120 } 128 121 curr = ilist; 129 while(curr != NULL) { 130 if(curr->inode == inode && curr->dev == dev) return 1; 122 while (curr != NULL) { 123 if (curr->inode == inode && curr->dev == dev) 124 return 1; 131 125 last = curr; 132 126 curr = curr->next; 133 127 } 134 curr = x malloc(sizeof(inode_list));128 curr = xzalloc(sizeof(inode_list)); 135 129 last->next = curr; 136 130 curr->dev = dev; 137 131 curr->inode = inode; 138 curr->next = NULL;132 /*curr->next = NULL;*/ 139 133 return 1; 140 134 } … … 147 141 ino_t tmp_inode; 148 142 dev_t tmp_dev; 149 long long 143 long long uint64_inode; 150 144 int tmp_port; 151 145 FILE *f; 152 146 153 if(!fuser_find_socket_dev(&tmp_dev)) tmp_dev = 0; 154 sprintf(path, "%s/net/%s", FUSER_PROC_DIR, proto); 155 156 if (!(f = fopen(path, "r"))) return 0; 157 while(fgets(line, FUSER_MAX_LINE, f)) { 158 if(sscanf(line, 159 "%*d: %64[0-9A-Fa-f]:%x %*x:%*x %*x %*x:%*x " 160 "%*x:%*x %*x %*d %*d %llu", 161 addr, &tmp_port, &uint64_inode) == 3) { 162 if((strlen(addr) == 8) && 163 (opts & FUSER_OPT_IP6)) continue; 164 else if((strlen(addr) > 8) && 165 (opts & FUSER_OPT_IP4)) continue; 166 if(tmp_port == port) { 147 if (!fuser_find_socket_dev(&tmp_dev)) 148 tmp_dev = 0; 149 sprintf(path, FUSER_PROC_DIR "/net/%s", proto); 150 151 f = fopen(path, "r"); 152 if (!f) 153 return 0; 154 while (fgets(line, FUSER_MAX_LINE, f)) { 155 if (sscanf(line, "%*d: %64[0-9A-Fa-f]:%x %*x:%*x %*x %*x:%*x " 156 "%*x:%*x %*x %*d %*d %llu", 157 addr, &tmp_port, &uint64_inode) == 3 158 ) { 159 if (strlen(addr) == 8 && (opts & FUSER_OPT_IP6)) 160 continue; 161 if (strlen(addr) > 8 && (opts & FUSER_OPT_IP4)) 162 continue; 163 if (tmp_port == port) { 167 164 tmp_inode = uint64_inode; 168 165 fuser_add_inode(ilist, tmp_dev, tmp_inode); 169 166 } 170 167 } 171 172 168 } 173 169 fclose(f); … … 181 177 curr = ilist; 182 178 183 while (curr) {184 if ((opts & FUSER_OPT_MOUNT) &&curr->dev == dev)179 while (curr) { 180 if ((opts & FUSER_OPT_MOUNT) && curr->dev == dev) 185 181 return 1; 186 if (curr->inode == inode && curr->dev == dev)182 if (curr->inode == inode && curr->dev == dev) 187 183 return 1; 188 184 curr = curr->next; … … 201 197 dev_t dev; 202 198 203 if (!(file = fopen(fname, "r"))) return 0; 199 file = fopen(fname, "r"); 200 if (!file) 201 return 0; 204 202 while (fgets(line, FUSER_MAX_LINE, file)) { 205 if (sscanf(line, "%*s %*s %*s %x:%x %llu",206 &major, &minor, &uint64_inode) != 3)continue;203 if (sscanf(line, "%*s %*s %*s %x:%x %llu", &major, &minor, &uint64_inode) != 3) 204 continue; 207 205 inode = uint64_inode; 208 if(major == 0 && minor == 0 && inode == 0) continue; 206 if (major == 0 && minor == 0 && inode == 0) 207 continue; 209 208 dev = makedev(major, minor); 210 if (fuser_search_dev_inode(opts, ilist, dev, inode)) {209 if (fuser_search_dev_inode(opts, ilist, dev, inode)) { 211 210 fuser_add_pid(plist, pid); 212 211 } 213 214 212 } 215 213 fclose(file); … … 223 221 dev_t dev; 224 222 225 if(!fuser_file_to_dev_inode(lname, &dev, &inode)) return 0; 226 if(fuser_search_dev_inode(opts, ilist, dev, inode)) 223 if (!fuser_file_to_dev_inode(lname, &dev, &inode)) 224 return 0; 225 if (fuser_search_dev_inode(opts, ilist, dev, inode)) 227 226 fuser_add_pid(plist, pid); 228 227 return 1; … … 236 235 char *lname; 237 236 238 if((d = opendir(dname))) { 239 while((de = readdir(d)) != NULL) { 240 lname = concat_subpath_file(dname, de->d_name); 241 if(lname == NULL) 242 continue; 243 fuser_scan_link(opts, lname, pid, ilist, plist); 244 free(lname); 245 } 246 closedir(d); 247 } 248 else return 0; 249 return 1; 250 237 d = opendir(dname); 238 if (!d) 239 return 0; 240 while ((de = readdir(d)) != NULL) { 241 lname = concat_subpath_file(dname, de->d_name); 242 if (lname == NULL) 243 continue; 244 fuser_scan_link(opts, lname, pid, ilist, plist); 245 free(lname); 246 } 247 closedir(d); 248 return 1; 251 249 } 252 250 … … 258 256 char *dname; 259 257 260 if(!(d = opendir(FUSER_PROC_DIR))) return 0; 261 while((de = readdir(d)) != NULL) { 258 d = opendir(FUSER_PROC_DIR); 259 if (!d) 260 return 0; 261 while ((de = readdir(d)) != NULL) { 262 262 pid = (pid_t)atoi(de->d_name); 263 if(!pid) continue; 263 if (!pid) 264 continue; 264 265 dname = concat_subpath_file(FUSER_PROC_DIR, de->d_name); 265 if (chdir(dname) < 0) {266 if (chdir(dname) < 0) { 266 267 free(dname); 267 268 continue; … … 285 286 pid_list *curr = plist; 286 287 287 if(plist == NULL) return 0; 288 while(curr != NULL) { 289 if(curr->pid > 0) printf("%d ", curr->pid); 290 curr = curr->next; 291 } 292 printf("\n"); 288 if (plist == NULL) 289 return 0; 290 while (curr != NULL) { 291 if (curr->pid > 0) 292 printf("%d ", curr->pid); 293 curr = curr->next; 294 } 295 puts(""); 293 296 return 1; 294 297 } … … 300 303 int success = 1; 301 304 302 if(plist == NULL) return 0; 303 while(curr != NULL) { 304 if(curr->pid > 0 && curr->pid != mypid) { 305 if (plist == NULL) 306 return 0; 307 while (curr != NULL) { 308 if (curr->pid > 0 && curr->pid != mypid) { 305 309 if (kill(curr->pid, sig) != 0) { 306 bb_perror_msg( 307 "Could not kill pid '%d'", curr->pid); 310 bb_perror_msg("kill pid '%d'", curr->pid); 308 311 success = 0; 309 312 } … … 314 317 } 315 318 319 int fuser_main(int argc, char **argv); 316 320 int fuser_main(int argc, char **argv) 317 321 { 322 /*static -- huh???*/ int opt = 0; /* FUSER_OPT_ */ 323 318 324 int port, i, optn; 319 325 int* fni; /* file name indexes of argv */ 320 326 int fnic = 0; /* file name index count */ 321 327 const char *proto; 322 static int opt = 0; /* FUSER_OPT_ */323 328 dev_t dev; 324 329 ino_t inode; … … 332 337 333 338 fni = xmalloc(sizeof(int)); 334 for (i=1;i<argc;i++) {339 for (i = 1; i < argc; i++) { 335 340 optn = fuser_option(argv[i]); 336 if(optn) opt |= optn; 337 else if(argv[i][0] == '-') { 338 if(!(u_signal_names(argv[i]+1, &killsig, 0))) 341 if (optn) 342 opt |= optn; 343 else if (argv[i][0] == '-') { 344 killsig = get_signum(argv[i]+1); 345 if (killsig < 0) 339 346 killsig = SIGTERM; 340 } 341 else { 347 } else { 342 348 fni = xrealloc(fni, sizeof(int) * (fnic+2)); 343 349 fni[fnic++] = i; 344 350 } 345 351 } 346 if(!fnic) return 1; 347 348 pids = xmalloc(sizeof(pid_list)); 352 353 if (!fnic) 354 return 1; 355 349 356 inodes = xmalloc(sizeof(inode_list)); 350 for (i=0;i<fnic;i++) {351 if (fuser_parse_net_arg(argv[fni[i]], &proto, &port)) {357 for (i = 0; i < fnic; i++) { 358 if (fuser_parse_net_arg(argv[fni[i]], &proto, &port)) { 352 359 fuser_scan_proc_net(opt, proto, port, inodes); 353 } 354 else { 355 if(!fuser_file_to_dev_inode( 356 argv[fni[i]], &dev, &inode)) { 357 free(pids); 358 free(inodes); 359 bb_perror_msg_and_die( 360 "Could not open '%s'", argv[fni[i]]); 360 } else { 361 if (!fuser_file_to_dev_inode(argv[fni[i]], &dev, &inode)) { 362 if (ENABLE_FEATURE_CLEAN_UP) 363 free(inodes); 364 bb_perror_msg_and_die("cannot open '%s'", argv[fni[i]]); 361 365 } 362 366 fuser_add_inode(inodes, dev, inode); 363 367 } 364 368 } 369 pids = xmalloc(sizeof(pid_list)); 365 370 success = fuser_scan_proc_pids(opt, inodes, pids); 366 371 /* if the first pid in the list is 0, none have been found */ 367 if(pids->pid == 0) success = 0; 368 if(success) { 369 if(opt & FUSER_OPT_KILL) { 372 if (pids->pid == 0) 373 success = 0; 374 if (success) { 375 if (opt & FUSER_OPT_KILL) { 370 376 success = fuser_kill_pid_list(pids, killsig); 371 } 372 else if(!(opt & FUSER_OPT_SILENT)) { 377 } else if (!(opt & FUSER_OPT_SILENT)) { 373 378 success = fuser_print_pid_list(pids); 374 379 } 375 380 } 376 free(pids); 377 free(inodes); 381 if (ENABLE_FEATURE_CLEAN_UP) { 382 free(pids); 383 free(inodes); 384 } 378 385 /* return 0 on (success == 1) 1 otherwise */ 379 386 return (success != 1);
Note:
See TracChangeset
for help on using the changeset viewer.